gpt4 book ai didi

c++ - 使用 C++ 将 UDP 数据包存储在结构中

转载 作者:行者123 更新时间:2023-11-30 04:58:20 24 4
gpt4 key购买 nike

我是 C++ 编程新手。我正在尝试创建一个与 Camera 通信的软件。我能够将 Camera 与我的 Software 通信。通过 WireShark,我可以看到摄像头正在向我发送 packet,它是 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个字节我想在此 struct

中存储确切的值

我的代码存储在 Struct 中

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;
}

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

示例

如果 2 个字节是 10 01,当我使用 + 运算符时,结果是 11,这是不正确的正确答案应该是 1001

谁能告诉我如何将所有数据放入结构中

最佳答案

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

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

}ProtocolStruct;

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

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

关于c++ - 使用 C++ 将 UDP 数据包存储在结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51685314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com