我试图发送327200字节帧的流
所以我决定把每个帧分成6个包,每个包51200字节,然后发送出去;

void sendframe(char *data)
{
    char *tmparr[6];
    for(int i=0;i<6;i++)
    {
        tmparr[i] = data +(i*51200);
    }
    for(int i=0;i<6;i++)
    {
        n = sendto(sockfd, tmparr[i], 51200, 0, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
        if (n < 0)
          error("ERROR in sendto");
    }
}

为什么服务器只接收4或5个数据包??
从不小于6也不小于4,而且它们在包中是没有丢失的,每个包是51200字节,丢失的只是在包的编号上它从不接收不完整的包??
注意:
我使用的是linux,发送方和接收方是本地主机

最佳答案

UDP是一种“尽力而为”的协议。如果数据在传输过程中丢失,则不会重新传输。这可能很大程度上取决于数据的可靠性。
如果前4或5个数据报填满队列6,则可能会被丢弃。
另外,如果到达目的地的路径上的最大传输单元(MTU)小于您的数据包的大小,那么数据报将被碎片化,分成部分。因为你没有重新传输,任何碎片的丢失都会毁了整个包。随着数据报越来越大,这种变化将增加。看来,大多数人建议在512字节附近的UDP数据包的最大大小,如果你要穿越互联网与它。

08-04 14:12