我是C语言的新手,我正在尝试构建UDP数据报,然后将其从客户端程序发送到另一台计算机上的服务器程序。
尝试构建数据报时,尤其是固定大小(IPv4)标头时,我遇到了一些问题:
标头的格式为(客户端IP(32位)|客户端端口(16位)|数据包长度(32位)| ...等)
我选择使用的方法是收集必要的标头和正文信息,然后将它们转换为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*
不是构建数据报所需的数据结构。有人可以为我建立数据报的固定大小标头指出正确的方向吗? 最佳答案
您不负责生成IPv4标头。 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);