我是 C 语言新手,我正在尝试构建一个 UDP 数据报,然后将其从客户端程序发送到另一台计算机上的服务器程序。
我在尝试构建数据报时遇到了一些问题,特别是固定大小(IPv4) header : header 的格式为(客户端IP(32位)|客户端端口(16位)|数据包长度(32位)|...等)
我选择采用的方法是收集必要的 header 和正文信息,然后将它们转换为 char*
,然后将它们连接在一起以生成数据报。但是,当我将 int
和 long
转换为 char*
(端口号和数据包长度)时,它不能保证固定大小的 char *
(例如,如果计算出数据包长度(数据类型 long)为 440,我将其转换为 char*
,则 strlen 将显示 char* 的长度
是 2 而不是 4,因为这个数字不够大,无法占用全部 4 个字节,我认为...)
我尝试了一种通过按位操作将 long 转换为固定大小 char* 的不同方法:
//assume the datagram size was calculated to be 440 bits
unsigned long len = 440;
unsigned char dg_len [4];
dg_len[0] = (len >> 24) & 0xFF;
dg_len[1] = (len >> 16) & 0xFF;
dg_len[2] = (len >> 8) & 0xFF;
dg_len[3] = len & 0xFF;
printf("%d" ,strlen(dg_lenPtr)); //this would display 0
printf("%d" ,(unsigned long)dg_lenPtr); //this display some random number
我对此想到的唯一解释是,由于 strlen 显示长度为 0,因此 dg_lenPtr 未使用的 2 个高字节被读取为空字符。
我开始认为 char*
不是我需要用来构建数据报的数据结构。有人可以指出我需要做什么来为数据报构建固定大小的 header 的正确方向吗?
最佳答案
您不负责生成 IPv4 header 。 send()
和 sendto()
函数会为您处理该问题。您所要做的就是将所需的数据报有效负载发送到所需的目标 IP:Port(通过将其直接指定到 sendto()
或 connect()
中send()
的情况)。
int connect(int socket, const struct sockaddr *address, socklen_t address_len);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
关于c - 在 C 中构建具有固定大小 header 的 UDP 数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25584697/