1 #include "otsdaq-core/NetworkUtilities/ReceiverSocket.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
4 #include "otsdaq-core/NetworkUtilities/NetworkConverters.h"
10 #include <arpa/inet.h>
17 ReceiverSocket::ReceiverSocket(std::string IPAddress,
unsigned int port)
19 , addressLength_(sizeof(fromAddress_))
29 ReceiverSocket::ReceiverSocket(
void)
30 : addressLength_(sizeof(fromAddress_))
38 ReceiverSocket::~ReceiverSocket(
void)
43 int ReceiverSocket::receive(std::string& buffer,
unsigned int timeoutSeconds,
44 unsigned int timeoutUSeconds,
bool verbose)
46 return receive(buffer, dummyIPAddress_, dummyPort_, timeoutSeconds, timeoutUSeconds, verbose);
53 int ReceiverSocket::receive(std::string& buffer,
unsigned long& fromIPAddress,
54 unsigned short& fromPort,
unsigned int timeoutSeconds,
unsigned int timeoutUSeconds,
58 std::lock_guard<std::mutex> lock(receiveMutex_);
61 timeout_.tv_sec = timeoutSeconds;
62 timeout_.tv_usec = timeoutUSeconds;
64 FD_ZERO(&fileDescriptor_);
65 FD_SET(socketNumber_ , &fileDescriptor_);
66 select(socketNumber_+1, &fileDescriptor_, 0, 0, &timeout_);
68 if(FD_ISSET(socketNumber_, &fileDescriptor_))
70 buffer.resize(maxSocketSize_);
71 if ((numberOfBytes_ = recvfrom(socketNumber_, &buffer[0], maxSocketSize_, 0, (
struct sockaddr *)&fromAddress_, &addressLength_)) == -1)
73 __COUT__ <<
"At socket with IPAddress: " << getIPAddress() <<
" port: " << getPort() << std::endl;
74 __SS__ <<
"Error reading buffer from\tIP:\t";
75 std::string fromIP = inet_ntoa(fromAddress_.sin_addr);
76 fromIPAddress = fromAddress_.sin_addr.s_addr;
77 fromPort = fromAddress_.sin_port;
78 for(
int i = 0; i < 4; i++)
80 ss << ((fromIPAddress << (i * 8)) & 0xff);
84 ss <<
"\tPort\t" << ntohs(fromPort) <<
" IP " << fromIP << std::endl;
85 __COUT__ <<
"\n" << ss.str();
90 fromIPAddress = fromAddress_.sin_addr.s_addr;
91 fromPort = fromAddress_.sin_port;
100 buffer.resize(numberOfBytes_);
105 std::string fromIP = inet_ntoa(fromAddress_.sin_addr);
107 __COUT__ <<
"Receiving " <<
108 " at: " << getIPAddress() <<
111 std::cout <<
":" << ntohs(fromPort) <<
112 " size: " << buffer.size() << std::endl;
133 <<
"No new messages for " << timeoutSeconds+timeoutUSeconds/1000.
134 <<
"s (Total " << readCounter_*(timeoutSeconds+timeoutUSeconds/1000.)
135 <<
"s). Read request timed out receiving on " <<
136 " " << getIPAddress() <<
146 int ReceiverSocket::receive(std::vector<uint32_t>& buffer,
unsigned int timeoutSeconds,
unsigned int timeoutUSeconds,
bool verbose)
148 return receive(buffer, dummyIPAddress_, dummyPort_, timeoutSeconds, timeoutUSeconds, verbose);
155 int ReceiverSocket::receive(std::vector<uint32_t>& buffer,
unsigned long& fromIPAddress,
unsigned short& fromPort,
unsigned int timeoutSeconds,
unsigned int timeoutUSeconds,
bool verbose)
158 std::lock_guard<std::mutex> lock(receiveMutex_);
161 timeout_.tv_sec = timeoutSeconds;
162 timeout_.tv_usec = timeoutUSeconds;
164 FD_ZERO(&fileDescriptor_);
165 FD_SET(socketNumber_ , &fileDescriptor_);
166 select(socketNumber_+1, &fileDescriptor_, 0, 0, &timeout_);
167 __COUT__ <<
"Is this a successful reeeaaad???" << std::endl;
169 if(FD_ISSET(socketNumber_, &fileDescriptor_))
171 buffer.resize(maxSocketSize_/
sizeof(uint32_t));
172 if ((numberOfBytes_ = recvfrom(socketNumber_, &buffer[0], maxSocketSize_, 0, (
struct sockaddr *)&fromAddress_, &addressLength_)) == -1)
174 __COUT__ <<
"At socket with IPAddress: " << getIPAddress() <<
" port: " << getPort() << std::endl;
175 __SS__ <<
"Error reading buffer from\tIP:\t";
176 for(
int i = 0; i < 4; i++)
178 ss << ((fromIPAddress << (i * 8)) & 0xff);
182 ss <<
"\tPort\t" << fromPort << std::endl;
183 __COUT__ <<
"\n" << ss.str();
188 fromIPAddress = fromAddress_.sin_addr.s_addr;
189 fromPort = fromAddress_.sin_port;
198 buffer.resize(numberOfBytes_/
sizeof(uint32_t));
204 struct sockaddr_in sin;
205 socklen_t len =
sizeof(sin);
206 getsockname(socketNumber_, (
struct sockaddr *)&sin, &len);
209 __COUT__ << __COUT_HDR_FL__
210 <<
"No new messages for " << timeoutSeconds+timeoutUSeconds/1000.
211 <<
"s (Total " << readCounter_*(timeoutSeconds+timeoutUSeconds/1000.)
212 <<
"s). Read request timed out for port: " << ntohs(sin.sin_port)
216 __COUT__ <<
"This a successful reeeaaad" << std::endl;