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"
15 ReceiverSocket::ReceiverSocket(
void)
16 : addressLength_(sizeof(fromAddress_))
24 ReceiverSocket::ReceiverSocket(std::string IPAddress,
unsigned int port)
26 , addressLength_(sizeof(fromAddress_))
34 ReceiverSocket::~ReceiverSocket(
void)
39 int ReceiverSocket::receive(std::string& buffer,
unsigned int timeoutSeconds,
unsigned int timeoutUSeconds,
bool verbose)
41 return receive(buffer, dummyIPAddress_, dummyPort_, timeoutSeconds, timeoutUSeconds, verbose);
48 int ReceiverSocket::receive(std::string& buffer,
unsigned long& fromIPAddress,
unsigned short& fromPort,
unsigned int timeoutSeconds,
unsigned int timeoutUSeconds,
bool verbose)
51 std::lock_guard<std::mutex> lock(receiveMutex_);
54 timeout_.tv_sec = timeoutSeconds;
55 timeout_.tv_usec = timeoutUSeconds;
57 FD_ZERO(&fileDescriptor_);
58 FD_SET(socketNumber_ , &fileDescriptor_);
59 select(socketNumber_+1, &fileDescriptor_, 0, 0, &timeout_);
61 if(FD_ISSET(socketNumber_, &fileDescriptor_))
63 buffer.resize(maxSocketSize_);
64 if ((numberOfBytes_ = recvfrom(socketNumber_, &buffer[0], maxSocketSize_, 0, (
struct sockaddr *)&fromAddress_, &addressLength_)) == -1)
66 __MOUT__ <<
"At socket with IPAddress: " << getIPAddress() <<
" port: " << getPort() << std::endl;
67 __SS__ <<
"Error reading buffer from\tIP:\t";
68 for(
int i = 0; i < 4; i++)
70 ss << ((fromIPAddress << (i * 8)) & 0xff);
74 ss <<
"\tPort\t" << fromPort << std::endl;
75 __MOUT__ <<
"\n" << ss.str();
80 fromIPAddress = fromAddress_.sin_addr.s_addr;
81 fromPort = fromAddress_.sin_port;
90 buffer.resize(numberOfBytes_);
96 struct sockaddr_in sin;
97 socklen_t len =
sizeof(sin);
98 getsockname(socketNumber_, (
struct sockaddr *)&sin, &len);
102 <<
"No new messages for " << timeoutSeconds+timeoutUSeconds/1000.
103 <<
"s (Total " << readCounter_*(timeoutSeconds+timeoutUSeconds/1000.)
104 <<
"s). Read request timed out for port: " << ntohs(sin.sin_port)
113 int ReceiverSocket::receive(std::vector<uint32_t>& buffer,
unsigned int timeoutSeconds,
unsigned int timeoutUSeconds,
bool verbose)
115 return receive(buffer, dummyIPAddress_, dummyPort_, timeoutSeconds, timeoutUSeconds, verbose);
122 int ReceiverSocket::receive(std::vector<uint32_t>& buffer,
unsigned long& fromIPAddress,
unsigned short& fromPort,
unsigned int timeoutSeconds,
unsigned int timeoutUSeconds,
bool verbose)
125 std::lock_guard<std::mutex> lock(receiveMutex_);
128 timeout_.tv_sec = timeoutSeconds;
129 timeout_.tv_usec = timeoutUSeconds;
131 FD_ZERO(&fileDescriptor_);
132 FD_SET(socketNumber_ , &fileDescriptor_);
133 select(socketNumber_+1, &fileDescriptor_, 0, 0, &timeout_);
134 __MOUT__ <<
"Is this a successful reeeaaad???" << std::endl;
136 if(FD_ISSET(socketNumber_, &fileDescriptor_))
138 buffer.resize(maxSocketSize_/
sizeof(uint32_t));
139 if ((numberOfBytes_ = recvfrom(socketNumber_, &buffer[0], maxSocketSize_, 0, (
struct sockaddr *)&fromAddress_, &addressLength_)) == -1)
141 __MOUT__ <<
"At socket with IPAddress: " << getIPAddress() <<
" port: " << getPort() << std::endl;
142 __SS__ <<
"Error reading buffer from\tIP:\t";
143 for(
int i = 0; i < 4; i++)
145 ss << ((fromIPAddress << (i * 8)) & 0xff);
149 ss <<
"\tPort\t" << fromPort << std::endl;
150 __MOUT__ <<
"\n" << ss.str();
155 fromIPAddress = fromAddress_.sin_addr.s_addr;
156 fromPort = fromAddress_.sin_port;
165 buffer.resize(numberOfBytes_/
sizeof(uint32_t));
171 struct sockaddr_in sin;
172 socklen_t len =
sizeof(sin);
173 getsockname(socketNumber_, (
struct sockaddr *)&sin, &len);
176 __MOUT__ << __COUT_HDR_FL__
177 <<
"No new messages for " << timeoutSeconds+timeoutUSeconds/1000.
178 <<
"s (Total " << readCounter_*(timeoutSeconds+timeoutUSeconds/1000.)
179 <<
"s). Read request timed out for port: " << ntohs(sin.sin_port)
183 __MOUT__ <<
"This a successful reeeaaad" << std::endl;