当我用套接字传输结构时,我应该考虑字节顺序吗
Should I consider byte order when i transfer structure with socket
struct A
{
int a;
int b;
};
char data[10];
struct A a;
如果我使用 memcpy()
函数将 a
转换为字符数组 data
,并使用 socket.Should 传输它,我现在考虑字节顺序吗?
您可能应该知道,每个人在接收数据时都期望网络字节顺序。您遇到的另一个问题是填充。允许编译器在结构成员之间放置空的 space,这是需要对齐的原因。您当时只需发送一个网络字节顺序的结构成员即可解决此问题。您可以查找序列化函数。
如果它是一个真实的项目(将在现实世界中部署的东西)那么是的,您绝对需要关心字节顺序。您还需要关心其他序列化问题,包括数据类型大小和结构字段对齐。
您可以通过使用类型显式大小来消除一些令人头疼的问题,例如使用 int32_t
而不是 int
。
结构字段对齐问题要复杂得多。简短的回答:不要 send()
一台机器上的原始结构,而 recv()
另一台机器上的原始结构。这样做假设两个系统上的应用程序 运行 以完全相同的方式布置它们的结构字段(具有相同的填充)。
struct A
{
int a;
int b;
};
char data[10];
struct A a;
如果我使用 memcpy()
函数将 a
转换为字符数组 data
,并使用 socket.Should 传输它,我现在考虑字节顺序吗?
您可能应该知道,每个人在接收数据时都期望网络字节顺序。您遇到的另一个问题是填充。允许编译器在结构成员之间放置空的 space,这是需要对齐的原因。您当时只需发送一个网络字节顺序的结构成员即可解决此问题。您可以查找序列化函数。
如果它是一个真实的项目(将在现实世界中部署的东西)那么是的,您绝对需要关心字节顺序。您还需要关心其他序列化问题,包括数据类型大小和结构字段对齐。
您可以通过使用类型显式大小来消除一些令人头疼的问题,例如使用 int32_t
而不是 int
。
结构字段对齐问题要复杂得多。简短的回答:不要 send()
一台机器上的原始结构,而 recv()
另一台机器上的原始结构。这样做假设两个系统上的应用程序 运行 以完全相同的方式布置它们的结构字段(具有相同的填充)。