0

我正在尝试发送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

4

1 回答 1

4

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

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

此外,如果到达目的地的路径上的最大传输单元 (MTU) 永远小于数据包的大小,那么您的数据报将被分割成多个部分。由于您不重新传输,因此任何片段的丢失都将导致整个数据包失败。随着数据报变大,这种情况的变化将会增加。如果您要使用 UDP 数据包遍历 Internet,似乎大多数人建议将 0f 512 字节作为 UDP 数据包的最大大小。

于 2013-06-24T13:02:40.497 回答