使用C ++将UDP数据包存储在Structure中

时间:2018-08-04 11:54:19

标签: c++ sockets udp structure packet

我是C++编程的新手。我正在尝试创建一个与Camera通信的软件。我能够与Camera交流Software。 通过WireShark,我可以看到相机正在向我发送packet的{​​{1}}。

我想将该数据包存储在结构中。

例如:-

我收到的包裹是

hex representation

每个值均为 char packet_bytes[] = { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, }; 我想在此1 byte

中存储确切的值

我的代码存储在Struct中

struct

数据包大小为22,所以我这样存储值,我知道这是错误的。

示例

如果2个字节为m_receivedBytes = recvfrom(sock, (char*)m_packetBuffer, sizeof(m_packetBuffer), 0, (sockaddr*)&cameraInfo, &m_socketLength); if (m_receivedBytes > 0) { switch (m_protocolType) { case StreamProtocol: ProtocolStruct.m_status = m_packetBuffer[0] + m_packetBuffer[1]; ProtocolStruct.m_blockID = m_packetBuffer[2] + m_packetBuffer[3]; ProtocolStruct.m_format = m_packetBuffer[4]; ProtocolStruct.m_packetID = m_packetBuffer[5] + m_packetBuffer[6] + m_packetBuffer[7]; switch (ProtocolStruct.m_format) { case 1: ProtocolStruct.m_leader->m_fieldInfo = m_packetBuffer[9]; ProtocolStruct.m_leader->m_payloadType = m_packetBuffer[10] + m_packetBuffer[11]; break; default: break; } break; default: break; } ,则当我使用10 01运算符时,结果为+,这是不正确的。正确的答案应为11

所以任何人都可以告诉我如何将所有数据放入Structure

1 个答案:

答案 0 :(得分:1)

在处理电信数据包时,必须确保两个对等方共享相同的确切字节布局和顺序。 你的问题是结构定义是编译器特定的;一种快速而肮脏的方法是使用“打包”布局:

struct __attribute__((__packed__)) ProtocolStruct
{
    __int16         m_status;
    __int16         m_blockID;
    __int8          m_format;
    __int32         m_packetID;
    struct Trailer *m_trailer;

}ProtocolStruct;

这解决了布局问题,但解决了字节顺序问题,也解决了字节序问题。

但是并不总是足够见Is gcc's __attribute__((packed)) / #pragma pack unsafe?