我在C中实现了udp服务器和客户端。服务器(64位PC)正在向客户端(也是64位PC)发送包含数据包序列号的udp数据包。序号是无符号long int类型。服务器正确读取此序列号并通过套接字发送数据包。问题是在客户端,它正确读取所有数据包,直到他达到65 535数据包,然后他从0开始。这没有任何意义,因为在客户端的数据包的序列号也是无符号long int类型。下面也是我在客户端解码时在服务器端编码的功能,也许你可以看到错误? THX
服务器编码
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;
}
答案 0 :(得分:1)
查看你的客户端解码函数:它执行“pack.seq_num =”3次,然后是pack.seq_num + =, 所以实际上你只使用了最后2个字节,这就是每个65535个数据包溢出的原因。 只有第一行应该分配给pack.seq_num,其他3个必须添加(使用+ =)。
答案 1 :(得分:0)
在decode
函数中,重新分配到seq_num
成员,除了最后8位以外的每一行。这意味着你只能获得低16位。