otsdaq  v2_04_02
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(const std::string& message)
15 {
16  uint32_t length = htonl(TCPPacket::headerLength + message.length());
17  std::string buffer = std::string(TCPPacket::headerLength, ' ') +
18  message; // THE HEADER LENGTH IS SET TO 4 = sizeof(uint32_t)
19  buffer[0] = (length)&0xff;
20  buffer[1] = (length >> 8) & 0xff;
21  buffer[2] = (length >> 16) & 0xff;
22  buffer[3] = (length >> 24) & 0xff;
23 
24  // std::cout << __PRETTY_FUNCTION__
25  // << std::hex
26  // << "Message length: " << message.length()
27  // << ", Buffer length: " << buffer.length()
28  // << ", htonl length: " << length
29  // << std::dec
30 
31  // << std::endl;
32  // std::cout << __PRETTY_FUNCTION__ << "Sending-";
33  // for (auto l = 0; l < buffer.length(); l++)
34  // std::cout << buffer[l] << "-";
35  // std::cout << std::endl;
36  return buffer;
37 }
38 
39 //========================================================================================================================
40 void TCPPacket::reset(void) { fBuffer.clear(); }
41 
42 //========================================================================================================================
43 bool TCPPacket::decode(std::string& message)
44 {
45  if(fBuffer.length() < headerLength)
46  return false;
47  uint32_t length = ntohl(reinterpret_cast<uint32_t&>(
48  fBuffer.at(0))); // THE HEADER IS FIXED TO SIZE 4 = SIZEOF(uint32_t)
49  // std::cout << __PRETTY_FUNCTION__ << "Receiving-";
50  // or (auto l = 0; l < fBuffer.length(); l++)
51  // for (auto l = 0; l < 4; l++)
52  // std::cout << std::hex << (unsigned int)fBuffer[l] << std::dec << "-";
53  // std::cout << std::endl;
54  std::cout << __PRETTY_FUNCTION__
55  //<< std::hex
56  << "Buffer length: "
57  << fBuffer.length()
58  // << ", htonl length: " << length
59  << ", ntohl length: "
60  << length
61  //<< std::dec
62  << std::endl;
63  if(fBuffer.length() == length)
64  {
65  message = fBuffer.substr(headerLength);
66  fBuffer.clear();
67  return true;
68  }
69  else if(fBuffer.length() > length)
70  {
71  message = fBuffer.substr(headerLength, length - headerLength);
72  std::cout << __PRETTY_FUNCTION__ << "Erasing: " << length
73  << " characters!"
74  //<< " Msg:-" << message << "-"
75  << std::endl;
76  fBuffer.erase(0, length);
77  return true;
78  }
79  else
80  {
81  std::cout << __PRETTY_FUNCTION__
82  << "Can't decode an incomplete message! Length is only: "
83  << fBuffer.length() << std::endl;
84  return false;
85  }
86 }