我正在尝试发送 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
答案 0 :(得分:4)
UDP是“尽力而为”的协议。如果数据在传输过程中丢失,则不会重新传输。它可能在很大程度上取决于您的数据采用何种可靠性的路径。
如果前4或5个数据报填满队列,则可能会丢弃6。
此外,如果到目的地的路径上的最大传输单位(MTU)小于数据包的大小,则数据报将被分段,分成几部分。由于您不重新传输,任何片段的丢失都将导致整个数据包崩溃。随着数据报变大,这种情况的变化将会增加。似乎大多数人建议在邻居0f 512字节作为UDP数据包的最大大小,如果你要用它遍历互联网。