udp套接字上的C发送结构
我已经在C中实现了udp服务器和客户端。服务器(64位PC)正在向客户端(也是64位PC)发送包含数据包序列号的udp数据包。序列号是无符号长整型。服务器正确读取该序列号并通过套接字发送数据包。问题是在客户端,它正确读取所有数据包,直到他到达65535数据包,然后他从0开始。这没有任何意义,因为packet的客户端序列号也是无符号long int类型。下面是我在服务器端进行编码,在客户端进行解码的函数,也许你们可以看到错误?Thx 服务器编码udp套接字上的C发送结构,c,sockets,serialization,udp,C,Sockets,Serialization,Udp,我已经在C中实现了udp服务器和客户端。服务器(64位PC)正在向客户端(也是64位PC)发送包含数据包序列号的udp数据包。序列号是无符号长整型。服务器正确读取该序列号并通过套接字发送数据包。问题是在客户端,它正确读取所有数据包,直到他到达65535数据包,然后他从0开始。这没有任何意义,因为packet的客户端序列号也是无符号long int类型。下面是我在服务器端进行编码,在客户端进行解码的函数,也许你们可以看到错误?Thx 服务器编码 size_t encode(packet pack,
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;
}
数据包解码(char*buf){
包装;
无符号字符*pt=buf;
pack.tos=*pt++在decode
函数中,除了最后八位之外,您为每一行重新分配给seq_num
成员。这意味着您将只获得低16位。看看您的客户端解码函数:它会“pack.seq_num=”3次,然后是pack.seq_num+=,
因此,实际上您只使用最后2个字节,这就是为什么它每65535个数据包就会溢出一次。
只有第一行应该分配给pack.seq_num,其他3行必须添加(使用+=)。在encode
中有一种更简单的方法来获取大小:pt-buf
(但是您将+1
添加到strlen
中会使其变大一个字节)。我该如何改进最后一行?@user3852803最后一行是唯一一行。没关系,除了第一行,你需要对序列号进行+=
解码。以后,我建议你使用调试器,逐行检查代码,看看发生了什么,如果你用这段代码进行解码,就会非常清楚发生了什么错。我按照你说的做了改变,而且很有效!非常感谢你快速而正确的回答:)