我已经实现了udp服务器和客户端C. server (64位PC)发送包含数据包序列号的udp数据包给客户端(也是64位PC)。序列号为无符号长int类型。服务器正确读取此序列号并通过套接字发送数据包。问题是在客户端,它正确地读取所有数据包,直到他到达65 535包,然后从0开始。这是没有意义的,因为在客户端,packetis没有符号的长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;
}发布于 2014-11-17 14:52:41
看看您的客户端解码功能:它执行"pack.seq_num =“3次,然后是pack.seq_num +=,所以有效地只使用最后两个字节,这就是为什么它每65535个数据包就会溢出的原因。只有第一行应该分配给pack.seq_num,其他3行必须添加(使用+=)。
发布于 2014-11-17 14:52:11
在decode函数中,除了最后8位外,每一行都重新分配给seq_num成员。所以这意味着你只能得到低的16位。
https://stackoverflow.com/questions/26975224
复制相似问题