tdaq-develop-2025-02-12
TransceiverSocket.cc
1 #include "otsdaq/NetworkUtilities/TransceiverSocket.h"
2 #include "otsdaq/Macros/CoutMacros.h"
3 #include "otsdaq/MessageFacility/MessageFacility.h"
4 
5 #include <iostream>
6 
7 using namespace ots;
8 
9 //==============================================================================
10 TransceiverSocket::TransceiverSocket(void)
11 {
12  __COUT__ << "TransceiverSocket constructor " << __E__;
13 }
14 
15 //==============================================================================
16 TransceiverSocket::TransceiverSocket(std::string IPAddress, unsigned int port)
17  : Socket(IPAddress, port)
18 {
19  __COUT__ << "TransceiverSocket constructor " << IPAddress << ":" << port << __E__;
20 }
21 
22 //==============================================================================
23 TransceiverSocket::~TransceiverSocket(void) {}
24 
25 //==============================================================================
27 int TransceiverSocket::acknowledge(const std::string& buffer, bool verbose)
28 {
29  // lockout other senders for the remainder of the scope
30  std::lock_guard<std::mutex> lock(sendMutex_);
31 
32  if(verbose)
33  __COUT__ << "Acknowledging on Socket Descriptor #: " << socketNumber_
34  << " from-port: " << ntohs(socketAddress_.sin_port)
35  << " to-port: " << ntohs(ReceiverSocket::fromAddress_.sin_port)
36  << std::endl;
37 
38  constexpr size_t MAX_SEND_SIZE = 1500;
39  size_t offset = 0;
40  int sendToSize = 1;
41 
42  int sizeInBytes = 1;
43 
44  while(offset < buffer.size() && sendToSize > 0)
45  {
46  auto thisSize = sizeInBytes * (buffer.size() - offset) > MAX_SEND_SIZE
47  ? MAX_SEND_SIZE
48  : sizeInBytes * (buffer.size() - offset);
49  if(verbose)
50  __COUTTV__(thisSize);
51  sendToSize = sendto(socketNumber_,
52  &buffer[0] + offset,
53  thisSize,
54  0,
55  (struct sockaddr*)&(ReceiverSocket::fromAddress_),
56  sizeof(sockaddr_in));
57  offset += sendToSize / sizeInBytes;
58  }
59 
60  if(sendToSize <= 0)
61  {
62  __SS__ << "Error writing buffer from port "
63  << ntohs(TransmitterSocket::socketAddress_.sin_port) << ": "
64  << strerror(errno) << std::endl;
65  __SS_THROW__; //return -1;
66  }
67 
68  return 0;
69 } //end acknowledge()
70 
71 //==============================================================================
72 std::string TransceiverSocket::sendAndReceive(Socket& toSocket,
73  const std::string& sendBuffer,
74  unsigned int timeoutSeconds /* = 1 */,
75  unsigned int timeoutUSeconds /* = 0 */,
76  bool verbose /* = false */)
77 {
78  send(toSocket, sendBuffer, verbose);
79  std::string receiveBuffer;
80  if(receive(receiveBuffer, timeoutSeconds, timeoutUSeconds, verbose) < 0)
81  {
82  __SS__ << "Timeout (" << timeoutSeconds + timeoutUSeconds / 1000000.
83  << " s) or Error receiving response buffer from remote ip:port "
84  << toSocket.getIPAddress() << ":" << toSocket.getPort()
85  << " to this ip:port " << Socket::getIPAddress() << ":"
86  << Socket::getPort() << __E__;
87  __SS_THROW__;
88  }
89 
90  //assume response may be multiple packets! (and give 200 ms unless called with low timeout)
91  std::string receiveBuffer2;
92  while(receive(receiveBuffer2,
93  0 /*timeoutSeconds*/,
94  (timeoutSeconds == 0 && timeoutUSeconds < 200000)
95  ? timeoutUSeconds
96  : 200000 /*timeoutUSeconds*/,
97  verbose) >= 0)
98  {
99  receiveBuffer += receiveBuffer2; //append
100  }
101 
102  return receiveBuffer;
103 } //end sendAndReceive()
int acknowledge(const std::string &buffer, bool verbose=false)
responds to last receive location