0

327200 バイトのフレームのストリームを送信しようとしています

そこで、各フレームを51200 バイトのパケットごとに 6 つのパケットに分割して送信することにしました。

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を使用しており、送信者と受信者はローカルホストです

4

1 に答える 1

4

UDP は「ベスト エフォート」プロトコルです。転送中にデータが失われた場合、再転送はありません。どのような信頼性が得られるかは、おそらくデータがたどる経路に大きく依存します。

最初の 4 つまたは 5 つのデータグラムでキューがいっぱいになると、キュー 6 がドロップされる可能性があります。

さらに、宛先へのパスの最大伝送単位 (MTU) がパケットのサイズよりも小さい場合、データグラムは断片化され、部分に分割されます。再送信しないため、フラグメントが失われるとパケット全体が失われます。データグラムが大きくなるにつれて、このような変化が増加します。UDP パケットを使用してインターネットを横断する場合、UDP パケットの最大サイズとして、ほとんどの人が 0f 512 バイト前後を推奨しているようです。

于 2013-06-24T13:02:40.497 に答える