C通过udp socket发送struct

时间:2014-11-17 14:45:52

标签: c sockets serialization udp

我在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;
}

2 个答案:

答案 0 :(得分:1)

查看你的客户端解码函数:它执行“pack.seq_num =”3次,然后是pack.seq_num + =, 所以实际上你只使用了最后2个字节,这就是每个65535个数据包溢出的原因。 只有第一行应该分配给pack.seq_num,其他3个必须添加(使用+ =)。

答案 1 :(得分:0)

decode函数中,重新分配seq_num成员,除了最后8位以外的每一行。这意味着你只能获得低16位。