1 #include "otsdaq/NetworkUtilities/TransceiverSocket.h"
2 #include "otsdaq/Macros/CoutMacros.h"
3 #include "otsdaq/MessageFacility/MessageFacility.h"
11 TransceiverSocket::TransceiverSocket(
void)
13 __COUT__ <<
"TransceiverSocket constructor " << __E__;
17 TransceiverSocket::TransceiverSocket(std::string IPAddress,
unsigned int port)
20 __COUT__ <<
"TransceiverSocket constructor " << IPAddress <<
":" << port << __E__;
24 TransceiverSocket::~TransceiverSocket(
void) {}
31 std::lock_guard<std::mutex> lock(sendMutex_);
34 __COUTT__ <<
"Acknowledging on Socket Descriptor #: " << socketNumber_
35 <<
" from-port: " << ntohs(socketAddress_.sin_port)
36 <<
" to-port: " << ntohs(ReceiverSocket::fromAddress_.sin_port)
39 constexpr
size_t MAX_SEND_SIZE = 1500;
45 while(offset < buffer.size() && sendToSize > 0)
47 auto thisSize = sizeInBytes * (buffer.size() - offset) > MAX_SEND_SIZE
49 : sizeInBytes * (buffer.size() - offset);
52 sendToSize = sendto(socketNumber_,
56 (
struct sockaddr*)&(ReceiverSocket::fromAddress_),
58 offset += sendToSize / sizeInBytes;
63 __SS__ <<
"Error writing buffer from port "
64 << ntohs(TransmitterSocket::socketAddress_.sin_port) <<
": "
65 << strerror(errno) << std::endl;
77 const std::string& sendBuffer,
78 unsigned int timeoutSeconds ,
79 unsigned int timeoutUSeconds ,
82 using clock = std::chrono::steady_clock;
83 auto start = clock::now();
86 std::lock_guard<std::mutex> lock(
87 sendAndReceiveMutex_);
90 send(toSocket, sendBuffer, verbose);
92 __COUTT__ <<
" ----> Time sendAndReceive '" << sendBuffer
93 <<
"' (socketNumber=" << socketNumber_ <<
") check ==> "
94 << std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
97 <<
" milliseconds. PID=" << getpid()
98 <<
" TID=" << std::this_thread::get_id() << std::endl;
100 std::string receiveBuffer;
101 if(
receive(receiveBuffer, timeoutSeconds, timeoutUSeconds, verbose) < 0)
103 __SS__ <<
"Timeout (" << timeoutSeconds + timeoutUSeconds / 1000000.
104 <<
" s) or Error receiving response buffer from remote ip:port "
105 << toSocket.getIPAddress() <<
":" << toSocket.getPort()
106 <<
" to this ip:port " << Socket::getIPAddress() <<
":"
107 << Socket::getPort() << __E__;
111 __COUTT__ <<
" ----> Time sendAndReceive '" << sendBuffer <<
"' got "
112 << receiveBuffer.size() <<
" (socketNumber=" << socketNumber_
114 << std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
117 <<
" milliseconds. PID=" << getpid()
118 <<
" TID=" << std::this_thread::get_id() << std::endl;
121 std::string receiveBuffer2;
124 (timeoutSeconds == 0 && timeoutUSeconds < 10000)
129 receiveBuffer += receiveBuffer2;
131 __COUTT__ <<
" ----> Time sendAndReceive +" << receiveBuffer2.size()
133 << std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
136 <<
" milliseconds." << std::endl;
139 __COUTT__ <<
" ----> Time sendAndReceive " << receiveBuffer.size() <<
" check ==> "
140 << std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
143 <<
" milliseconds." << std::endl;
145 return receiveBuffer;
int receive(std::string &buffer, unsigned int timeoutSeconds=1, unsigned int timeoutUSeconds=0, bool verbose=false)
returns count of dropped packets
std::string sendAndReceive(Socket &toSocket, const std::string &sendBuffer, unsigned int timeoutSeconds=1, unsigned int timeoutUSeconds=0, bool verbose=false)
int acknowledge(const std::string &buffer, bool verbose=false)
responds to last receive location
defines used also by OtsConfigurationWizardSupervisor