gpt4 book ai didi

c - 通过 C 中的套接字发送包含枚举值的结构的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-01 02:31:44 25 4
gpt4 key购买 nike

我有很多不同的结构,其中包含我必须通过 TCP/IP 传输的枚举成员。虽然通信端点位于不同的操作系统(Windows XP 和 Linux)上,这意味着不同的编译器(gcc 4.x.x 和 MSVC 2008)两个程序部分共享具有类型声明的相同头文件。

出于性能原因,应该直接传输结构(请参阅下面的代码示例),而无需对内部成员进行昂贵的序列化或流式传输。

所以问题是如何确保两个编译器对枚举成员使用相同的内部内存表示(即都使用 32 位无符号整数)。或者如果有更好的方法来解决这个问题......

//type and enum declaration
typedef enum
{
A = 1,
B = 2,
C = 3
} eParameter;


typedef enum
{
READY = 400,
RUNNING = 401,
BLOCKED = 402
FINISHED = 403
} eState;


#pragma pack(push,1)
typedef struct
{
eParameter mParameter;
eState mState;
int32_t miSomeValue;
uint8_t miAnotherValue;
...
} tStateMessage;
#pragma pack(pop)


//... send via socket
tStateMessage msg;
send(iSocketFD,(void*)(&msg),sizeof(tStateMessage));

//... receive message on the other side
tStateMessage msg_received;
recv(iSocketFD,(void*)(&msg_received),sizeof(tStateMessage));

此外...
  • 由于两个端点都是小端机器,因此这里的端序不是问题。
  • 包#pragma 令人满意地解决了对齐问题。

  • 谢谢你的回答,
    阿克塞尔

    最佳答案

    我会务实地回答你的问题,因为你在权衡了性能提升和可能的缺点之后选择了一条相对冒险的道路(至少我希望你有!)。

    如果还考虑了针对这些编译器 future 更改的可移植性和健壮性,那么经验方法将是防止问题的最佳方法。

  • 确保在所有情况下都使用枚举的初始值设定项(您的示例就是这样做的)。
  • 进行经验测试以查看数据在接收方的解释方式。
  • 记录双方构建工具的版本号,并与源代码一起存档。最好也存档工具。
  • 记录您所做的一切,以便将来进行不可预见的维护。
  • 祈祷最好! ;-)
  • 关于c - 通过 C 中的套接字发送包含枚举值的结构的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3054159/

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