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) {}
33 std::lock_guard<std::mutex> lock(sendMutex_);
36 __COUTT__ <<
"Acknowledging on Socket Descriptor #: " << socketNumber_
37 <<
" from-port: " << ntohs(socketAddress_.sin_port)
38 <<
" to-port: " << ntohs(ReceiverSocket::fromAddress_.sin_port)
41 const size_t MAX_SEND_SIZE =
42 maxChunkSize > 65500u ?
static_cast<size_t>(65500u) : maxChunkSize;
48 while(offset < buffer.size() && sendToSize > 0)
50 auto thisSize = sizeInBytes * (buffer.size() - offset) > MAX_SEND_SIZE
52 : sizeInBytes * (buffer.size() - offset);
55 sendToSize = sendto(socketNumber_,
59 (
struct sockaddr*)&(ReceiverSocket::fromAddress_),
61 offset += sendToSize / sizeInBytes;
66 __SS__ <<
"Error writing buffer from port "
67 << ntohs(TransmitterSocket::socketAddress_.sin_port) <<
": "
68 << strerror(errno) << std::endl;
81 const std::string& sendBuffer,
82 unsigned int timeoutSeconds ,
83 unsigned int timeoutUSeconds ,
85 unsigned int interPacketTimeoutUSeconds )
87 using clock = std::chrono::steady_clock;
88 auto start = clock::now();
91 std::lock_guard<std::mutex> lock(
92 sendAndReceiveMutex_);
95 send(toSocket, sendBuffer, verbose);
97 __COUTT__ <<
" ----> Time sendAndReceive '" << sendBuffer
98 <<
"' (socketNumber=" << socketNumber_ <<
") check ==> "
99 << std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
102 <<
" milliseconds. PID=" << getpid()
103 <<
" TID=" << std::this_thread::get_id() << std::endl;
105 std::string receiveBuffer;
106 if(
receive(receiveBuffer, timeoutSeconds, timeoutUSeconds, verbose) < 0)
108 __SS__ <<
"Timeout (" << timeoutSeconds + timeoutUSeconds / 1000000.
109 <<
" s) or Error receiving response buffer from remote ip:port "
110 << toSocket.getIPAddress() <<
":" << toSocket.getPort()
111 <<
" to this ip:port " << Socket::getIPAddress() <<
":"
112 << Socket::getPort() << __E__;
116 __COUTT__ <<
" ----> Time sendAndReceive '" << sendBuffer <<
"' got "
117 << receiveBuffer.size() <<
" (socketNumber=" << socketNumber_
119 << std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
122 <<
" milliseconds. PID=" << getpid()
123 <<
" TID=" << std::this_thread::get_id() << std::endl;
126 std::string receiveBuffer2;
129 (timeoutSeconds == 0 && timeoutUSeconds < interPacketTimeoutUSeconds)
131 : interPacketTimeoutUSeconds,
134 receiveBuffer += receiveBuffer2;
136 __COUTT__ <<
" ----> Time sendAndReceive +" << receiveBuffer2.size()
138 << std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
141 <<
" milliseconds." << std::endl;
144 __COUTT__ <<
" ----> Time sendAndReceive " << receiveBuffer.size() <<
" check ==> "
145 << std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() -
148 <<
" milliseconds." << std::endl;
150 return receiveBuffer;
int receive(std::string &buffer, unsigned int timeoutSeconds=1, unsigned int timeoutUSeconds=0, bool verbose=false)
returns count of dropped packets
int acknowledge(const std::string &buffer, bool verbose=false, size_t maxChunkSize=1500)
responds to last receive location
std::string sendAndReceive(Socket &toSocket, const std::string &sendBuffer, unsigned int timeoutSeconds=1, unsigned int timeoutUSeconds=0, bool verbose=false, unsigned int interPacketTimeoutUSeconds=10000)
defines used also by OtsConfigurationWizardSupervisor