00001 #include "otsdaq-core/NetworkUtilities/ReceiverSocket.h"
00002 #include "otsdaq-core/MessageFacility/MessageFacility.h"
00003 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
00004 #include "otsdaq-core/NetworkUtilities/NetworkConverters.h"
00005
00006 #include <iostream>
00007 #include <sstream>
00008
00009 #include <arpa/inet.h>
00010 #include <sys/time.h>
00011
00012 using namespace ots;
00013
00014
00015 ReceiverSocket::ReceiverSocket(void)
00016 : addressLength_(sizeof(fromAddress_))
00017 , numberOfBytes_(0)
00018 , readCounter_ (0)
00019 {
00020
00021 }
00022
00023
00024 ReceiverSocket::ReceiverSocket(std::string IPAddress, unsigned int port)
00025 : Socket(IPAddress, port)
00026 , addressLength_(sizeof(fromAddress_))
00027 , numberOfBytes_(0)
00028 , readCounter_ (0)
00029 {
00030
00031 }
00032
00033
00034 ReceiverSocket::~ReceiverSocket(void)
00035 {
00036 }
00037
00038
00039 int ReceiverSocket::receive(std::string& buffer, unsigned int timeoutSeconds, unsigned int timeoutUSeconds, bool verbose)
00040 {
00041 return receive(buffer, dummyIPAddress_, dummyPort_, timeoutSeconds, timeoutUSeconds, verbose);
00042 }
00043
00044
00045
00046
00047
00048 int ReceiverSocket::receive(std::string& buffer, unsigned long& fromIPAddress, unsigned short& fromPort, unsigned int timeoutSeconds, unsigned int timeoutUSeconds, bool verbose)
00049 {
00050
00051 std::lock_guard<std::mutex> lock(receiveMutex_);
00052
00053
00054 timeout_.tv_sec = timeoutSeconds;
00055 timeout_.tv_usec = timeoutUSeconds;
00056
00057 FD_ZERO(&fileDescriptor_);
00058 FD_SET(socketNumber_ , &fileDescriptor_);
00059 select(socketNumber_+1, &fileDescriptor_, 0, 0, &timeout_);
00060
00061 if(FD_ISSET(socketNumber_, &fileDescriptor_))
00062 {
00063 buffer.resize(maxSocketSize_);
00064 if ((numberOfBytes_ = recvfrom(socketNumber_, &buffer[0], maxSocketSize_, 0, (struct sockaddr *)&fromAddress_, &addressLength_)) == -1)
00065 {
00066 __MOUT__ << "At socket with IPAddress: " << getIPAddress() << " port: " << getPort() << std::endl;
00067 __SS__ << "Error reading buffer from\tIP:\t";
00068 for(int i = 0; i < 4; i++)
00069 {
00070 ss << ((fromIPAddress << (i * 8)) & 0xff);
00071 if (i < 3)
00072 ss << ".";
00073 }
00074 ss << "\tPort\t" << fromPort << std::endl;
00075 __MOUT__ << "\n" << ss.str();
00076 return -1;
00077 }
00078
00079
00080 fromIPAddress = fromAddress_.sin_addr.s_addr;
00081 fromPort = fromAddress_.sin_port;
00082
00083
00084
00085
00086
00087
00088
00089
00090 buffer.resize(numberOfBytes_);
00091 readCounter_ = 0;
00092 }
00093 else
00094 {
00095 ++readCounter_;
00096 struct sockaddr_in sin;
00097 socklen_t len = sizeof(sin);
00098 getsockname(socketNumber_, (struct sockaddr *)&sin, &len);
00099
00100 if(verbose)
00101 __MOUT__
00102 << "No new messages for " << timeoutSeconds+timeoutUSeconds/1000.
00103 << "s (Total " << readCounter_*(timeoutSeconds+timeoutUSeconds/1000.)
00104 << "s). Read request timed out for port: " << ntohs(sin.sin_port)
00105 << std::endl;
00106 return -1;
00107 }
00108
00109 return 0;
00110 }
00111
00112
00113 int ReceiverSocket::receive(std::vector<uint32_t>& buffer, unsigned int timeoutSeconds, unsigned int timeoutUSeconds, bool verbose)
00114 {
00115 return receive(buffer, dummyIPAddress_, dummyPort_, timeoutSeconds, timeoutUSeconds, verbose);
00116 }
00117
00118
00119
00120
00121
00122 int ReceiverSocket::receive(std::vector<uint32_t>& buffer, unsigned long& fromIPAddress, unsigned short& fromPort, unsigned int timeoutSeconds, unsigned int timeoutUSeconds, bool verbose)
00123 {
00124
00125 std::lock_guard<std::mutex> lock(receiveMutex_);
00126
00127
00128 timeout_.tv_sec = timeoutSeconds;
00129 timeout_.tv_usec = timeoutUSeconds;
00130
00131 FD_ZERO(&fileDescriptor_);
00132 FD_SET(socketNumber_ , &fileDescriptor_);
00133 select(socketNumber_+1, &fileDescriptor_, 0, 0, &timeout_);
00134 __MOUT__ << "Is this a successful reeeaaad???" << std::endl;
00135
00136 if(FD_ISSET(socketNumber_, &fileDescriptor_))
00137 {
00138 buffer.resize(maxSocketSize_/sizeof(uint32_t));
00139 if ((numberOfBytes_ = recvfrom(socketNumber_, &buffer[0], maxSocketSize_, 0, (struct sockaddr *)&fromAddress_, &addressLength_)) == -1)
00140 {
00141 __MOUT__ << "At socket with IPAddress: " << getIPAddress() << " port: " << getPort() << std::endl;
00142 __SS__ << "Error reading buffer from\tIP:\t";
00143 for(int i = 0; i < 4; i++)
00144 {
00145 ss << ((fromIPAddress << (i * 8)) & 0xff);
00146 if (i < 3)
00147 ss << ".";
00148 }
00149 ss << "\tPort\t" << fromPort << std::endl;
00150 __MOUT__ << "\n" << ss.str();
00151 return -1;
00152 }
00153
00154
00155 fromIPAddress = fromAddress_.sin_addr.s_addr;
00156 fromPort = fromAddress_.sin_port;
00157
00158
00159
00160
00161
00162
00163
00164
00165 buffer.resize(numberOfBytes_/sizeof(uint32_t));
00166 readCounter_ = 0;
00167 }
00168 else
00169 {
00170 ++readCounter_;
00171 struct sockaddr_in sin;
00172 socklen_t len = sizeof(sin);
00173 getsockname(socketNumber_, (struct sockaddr *)&sin, &len);
00174
00175 if(verbose)
00176 __MOUT__ << __COUT_HDR_FL__
00177 << "No new messages for " << timeoutSeconds+timeoutUSeconds/1000.
00178 << "s (Total " << readCounter_*(timeoutSeconds+timeoutUSeconds/1000.)
00179 << "s). Read request timed out for port: " << ntohs(sin.sin_port)
00180 << std::endl;
00181 return -1;
00182 }
00183 __MOUT__ << "This a successful reeeaaad" << std::endl;
00184 return 0;
00185 }