【发布时间】:2026-01-13 01:35:01
【问题描述】:
我已经在 C 中实现了 udp 服务器和客户端。服务器(64 位 PC)正在向客户端(也是 64 位 PC)发送包含数据包序列号的 udp 数据包。序列号是 unsigned long int 类型。服务器正确读取此序列号并通过套接字发送数据包。问题出在客户端,它正确读取所有数据包,直到他达到 65 535 个数据包,然后他从 0 开始。这没有意义,因为在客户端,数据包的序列号也是无符号长整数类型。下面也是我在客户端解码时在服务器端编码的功能,也许你可以看到错误?谢谢
服务器编码
size_t encode(packet pack, char buf[MAX_SIZE]){
size_t pack_len;
unsigned char *pt = buf;
*pt++ = (pack.tos >> 8) & 255;
*pt++ = (pack.tos & 255);
*pt++ = (pack.seq_num >> 24) & 255 ;
*pt++ = (pack.seq_num >> 16)& 255;
*pt++ = (pack.seq_num >> 8) & 255;
*pt++ = (pack.seq_num & 255);
strcpy(pt,pack.buffer);
pt += strlen(pack.buffer)+1;
pack_len = sizeof(pack.tos) +sizeof(pack.seq_num) + strlen(pack.buffer);
return pack_len;
}
客户端解码
packet decode(char *buf) {
packet pack;
unsigned char *pt = buf;
pack.tos = *pt++ << 8;
pack.tos += *pt++;
pack.seq_num = *pt++ << 24;
pack.seq_num = *pt++ << 16;
pack.seq_num = *pt++ << 8;
pack.seq_num += *pt++;
strcpy(pack.buffer, pt);
return pack;
}
【问题讨论】:
-
有一种更简单的方法可以获取
encode中的大小:pt - buf(但是您将+1添加到strlen会使它变大一个字节)。
标签: c sockets serialization udp