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

标签 c linux sockets network-programming endianness

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

谢谢。

最佳答案

你说的是一个 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 地址,它们总是按网络字节顺序排列——所以你可以直接流式传输它。

关于c - 通过套接字发送任意长度的数组。字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2519155/

相关文章:

linux - Unix/Linux 符号链接(symbolic link)是否支持回退?

linux gst_element_factory_make ("rtspsrc",NULL)在 qt5 上失败

javascript - Node.js 集群尽可能频繁地处理数据

java - 如何在线程中向 JTextArea 追加新数据?

c - 打印出c中最长的子串

c - 是否有用于 C 的 3D 可视化库或工具包? (请不要使用 C++!)

linux - HiveMQ systemctl 服务不监听端口

c - 在UDP服务器编程中如何将传入的udp客户端与套接字绑定(bind)?

c++ - 使用 libproc 时如何正确释放内存

c - 将标准输出重定向到文件