tdaq-develop-2025-02-12
TCPPacket.cc
1 #include "otsdaq/NetworkUtilities/TCPPacket.h"
2 #include <arpa/inet.h>
3 #include <iostream>
4 
5 using namespace ots;
6 
7 //==============================================================================
8 TCPPacket::TCPPacket() : fBuffer("") {}
9 
10 //==============================================================================
11 TCPPacket::~TCPPacket(void) {}
12 
13 //==============================================================================
14 std::string TCPPacket::encode(char const* message, std::size_t length)
15 {
16  return encode(std::string(message, length));
17 }
18 
19 //==============================================================================
20 std::string TCPPacket::encode(const std::string& message)
21 {
22  uint32_t size = htonl(TCPPacket::headerLength + message.length());
23  std::string buffer = std::string(TCPPacket::headerLength, ' ') +
24  message; // THE HEADER LENGTH IS SET TO 4 = sizeof(uint32_t)
25  buffer[0] = (size) & 0xff;
26  buffer[1] = (size >> 8) & 0xff;
27  buffer[2] = (size >> 16) & 0xff;
28  buffer[3] = (size >> 24) & 0xff;
29 
30  // std::cout << __PRETTY_FUNCTION__
31  // << std::hex
32  // << "Message length: " << message.length()
33  // << ", Buffer length: " << buffer.length()
34  // << ", htonl length: " << size
35  // << std::dec
36 
37  // << std::endl;
38  // std::cout << __PRETTY_FUNCTION__ << "Sending-";
39  // for (auto l = 0; l < buffer.length(); l++)
40  // std::cout << buffer[l] << "-";
41  // std::cout << std::endl;
42  return buffer;
43 }
44 
45 //==============================================================================
46 void TCPPacket::reset(void) { fBuffer.clear(); }
47 
48 //==============================================================================
49 bool TCPPacket::isEmpty(void) { return !fBuffer.size(); }
50 
51 //==============================================================================
52 bool TCPPacket::decode(std::string& message)
53 {
54  if(fBuffer.length() < headerLength)
55  return false;
56  uint32_t length = ntohl(reinterpret_cast<uint32_t&>(
57  fBuffer.at(0))); // THE HEADER IS FIXED TO SIZE 4 = SIZEOF(uint32_t)
58  // std::cout << __PRETTY_FUNCTION__ << "Receiving-";
59  // or (auto l = 0; l < fBuffer.length(); l++)
60  // for (auto l = 0; l < 4; l++)
61  // std::cout << std::hex << (unsigned int)fBuffer[l] << std::dec << "-";
62  // std::cout << std::endl;
63  // std::cout << __PRETTY_FUNCTION__
64  // //<< std::hex
65  // << "Buffer length: "
66  // << fBuffer.length()
67  // // << ", htonl length: " << length
68  // << ", ntohl length: "
69  // << length
70  // //<< std::dec
71  // << std::endl;
72  if(fBuffer.length() == length)
73  {
74  message = fBuffer.substr(headerLength);
75  fBuffer.clear();
76  return true;
77  }
78  else if(fBuffer.length() > length)
79  {
80  message = fBuffer.substr(headerLength, length - headerLength);
81  // std::cout << __PRETTY_FUNCTION__ << "Erasing: " << length
82  // << " characters!"
83  // //<< " Msg:-" << message << "-"
84  // << std::endl;
85  fBuffer.erase(0, length);
86  return true;
87  }
88  else
89  {
90  // std::cout << __PRETTY_FUNCTION__ << "Can't decode an incomplete message! Length is only: " << fBuffer.length() << std::endl;
91  return false;
92  }
93 }
void reset(void)
Resets the storage buffer.
Definition: TCPPacket.cc:46