udp套接字上的C发送结构

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,

我已经在C中实现了udp服务器和客户端。服务器(64位PC)正在向客户端(也是64位PC)发送包含数据包序列号的udp数据包。序列号是无符号长整型。服务器正确读取该序列号并通过套接字发送数据包。问题是在客户端,它正确读取所有数据包,直到他到达65535数据包,然后他从0开始。这没有任何意义,因为packet的客户端序列号也是无符号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;
}
数据包解码(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最后一行是唯一一行。没关系,除了第一行,你需要对序列号进行
+=
解码。以后,我建议你使用调试器,逐行检查代码,看看发生了什么,如果你用这段代码进行解码,就会非常清楚发生了什么错。我按照你说的做了改变,而且很有效!非常感谢你快速而正确的回答:)