在C/S程序中,往往需要在服务端和客户端传送结构体,在最近的一个项目中定义了如下的结构体:
class ISign
{
public:
unsigned short m_sSign;
long m_sSumLen;
char md5[40];
long reqId;
};
#define SIGN_LEN sizeof(ISign)客户端和服务器端都使用了该结构体,由于在服务器端重新指定了对齐方式(#pragma pack(1)),所以SIGN_LEN的长度是50(2+4+40+4),
但在客户端程序中使用了默认的对齐方式(#pragma pack()),所以SIGN_LEN的长度是52(4+4+40+4)。
在这种情况下,使用SOCKET发送标识头的时候,由于客户端和服务端之间约定的字节流长度不一致,导致程序无法运行。
其他知识点:
可以通过#pragma pack(X), 在代码中改变部分结构体的对齐方式,也可以通过VS2008来设置,如下图
参考资料:
http://blog.youkuaiyun.com/susan19890313/article/details/7489848
本文探讨了在C/S架构下,因客户端和服务端结构体对齐方式不同而导致的问题。具体分析了一个实例,其中定义了一个结构体并在两端采用不同的对齐设置,导致字节流长度不一致,进而引发程序运行失败。
415

被折叠的 条评论
为什么被折叠?



