通过套接字发送任意长度的数组。字节序

时间:2010-03-25 20:33:37

标签: c linux sockets network-programming endianness

我现在正在使用套接字编程,我遇到了一个问题,我不知道如何以便携方式解决。 任务很简单:我需要通过网络发送16字节的数组,在客户端应用程序中接收它并解析它。我知道,有一些函数,如htonl,htons等,可以与uint16和uint32一起使用。但是,我应该如何处理大于此数据的数据呢?

谢谢。

4 个答案:

答案 0 :(得分:3)

Endianness是多字节变量的属性,例如16位和32位整数。它与高阶或低阶字节是否先行有关。如果客户端应用程序将数组作为单个字节处理,则不必担心字节顺序,因为字节中位的顺序是相同的。

答案 1 :(得分:3)

你说一个16字节的数组。这并没有真正帮助。字节顺序仅对大于一个字节的事物有用。

如果它真的是原始字节然后只是发送它们,你将收到它们相同的

如果它真的是你要发送它的结构

 struct msg
 {
     int foo;
     int bar;
 .....

然后你需要通过缓冲区来提取你想要的值。

发送时,您必须将数据包组装成标准订单

 int off = 0;
 *(int*)&buff[off] = htonl(foo);
 off += sizeof(int);
 *(int*)&buff[off] = htonl(bar);
 ...

收到时

 int foo = ntohl((int)buff[off]);
 off += sizeof(int);
 int bar = ntohl((int)buff[off]);
 ....

编辑:我发现你想发送一个IPv6地址,它们总是按照网络字节顺序排列 - 所以你可以直接生成它。

答案 2 :(得分:1)

htonshtonl等用于处理大于一个字节的单个数据项(例如,int)。一个字节数组,其中每个字节本身用作单个数据项(例如,字符串),根本不需要在主机和网络字节顺序之间进行转换。

答案 3 :(得分:1)

字节本身不再具有字节序,因为计算机传输的任何单个字节在不同的接收计算机中具有相同的值。如今,字节序仅与多字节数据类型(如int)具有相关性。

在您的特定情况下,它归结为知道接收器将对您的16个字节做什么。如果它将数组中的16个条目中的每个条目视为离散的单字节值,那么您可以发送它们而不必担心endiannes。另一方面,如果接收器将您的16字节数组视为四个32位整数,那么您需要在发送之前通过hton()运行每个整数。

这有帮助吗?