在C中用UDP发送一个大文件

时间:2013-06-24 12:55:58

标签: c networking udp

我正在尝试发送 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,发送者和接收者都是localhost

1 个答案:

答案 0 :(得分:4)

UDP是“尽力而为”的协议。如果数据在传输过程中丢失,则不会重新传输。它可能在很大程度上取决于您的数据采用何种可靠性的路径。

如果前4或5个数据报填满队列,则可能会丢弃6。

此外,如果到目的地的路径上的最大传输单位(MTU)小于数据包的大小,则数据报将被分段,分成几部分。由于您不重新传输,任何片段的丢失都将导致整个数据包崩溃。随着数据报变大,这种情况的变化将会增加。似乎大多数人建议在邻居0f 512字节作为UDP数据包的最大大小,如果你要用它遍历互联网。