c++ udp send big packet

UDP datagram 大小限制 65,535 bytes

测试socket udp 单次传输数据上限(sendto()函数data不能超过65507字节。udp头占8字节,ip头占20字节,加起来正好65535字节)

void udp_test()
{
    char *p = new char[65507];
    string strsend;
    strsend.assign(p, 65507);
    int ret = udp_send("127.0.0.1", 8888, strsend);
    printf("udp_send ret=%d\n", ret);
    delete[] p;
}

udp_send ip=127.0.0.1,port=8888
send buffer size = 163840
sendto ret = 65507
udp_send ret=65507

void udp_test()
{
    char *p = new char[65508];
    string strsend;
    strsend.assign(p, 65508);
    int ret = udp_send("127.0.0.1", 8888, strsend);
    printf("udp_send ret=%d\n", ret);
    delete[] p;
}

udp_send ip=127.0.0.1,port=8888
send buffer size = 163840
sendto ret = -1
udp_send ret=-1

UDP仅提供数据报作为IP数据包的数据部分,IP数据包具有16位长度的字段,因此将数据限制为2 ^ 16字节(包括标题),或UDP数据部分的65507字节(假设没有ipv4选项) ,除了用UDP处理更大的数据包外,除了将它们分成几个数据包并自行处理重组等之外,没有其他方法。

UDP规范在UDP报头中为您提供16位的数据包大小,这意味着您一次发送的字节数不能超过65k。您必须将数据拆分为多个数据包。使用TCP代替UDP将使事情变得更加简单,因为可以确保完整性和接收顺序。

本文链接地址:https://const.net.cn/273.html

标签: linux, udp, socket

添加新评论