【问题标题】:C sending structure over udp socketC通过udp套接字发送结构
【发布时间】:2026-01-13 01:35:01
【问题描述】:

我已经在 C 中实现了 udp 服务器和客户端。服务器(64 位 PC)正在向客户端(也是 64 位 PC)发送包含数据包序列号的 udp 数据包。序列号是 unsigned long int 类型。服务器正确读取此序列号并通过套接字发送数据包。问题出在客户端,它正确读取所有数据包,直到他达到 65 535 个数据包,然后他从 0 开始。这没有意义,因为在客户端,数据包的序列号也是无符号长整数类型。下面也是我在客户端解码时在服务器端编码的功能,也许你可以看到错误?谢谢

服务器编码

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

【问题讨论】:

  • 有一种更简单的方法可以获取encode 中的大小:pt - buf(但是您将+1 添加到strlen 会使它变大一个字节)。

标签: c sockets serialization udp


【解决方案1】:

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

【讨论】:

  • 我按你说的改了,效果很好!非常感谢您快速正确的回答:)
【解决方案2】:

decode 函数中,您重新分配seq_num 成员,除了最后八位之外的每一行。所以这意味着你只会得到低 16 位。

【讨论】:

  • 如何改进最后一行?
  • @user3852803 最后一行是唯一没问题的,除了第一行解码序列号之外,您需要在所有代码上执行+=。以后,我建议您使用调试器,并逐行检查代码以查看发生了什么,如果您使用此代码进行操作,那么问题将变得非常明显。