0

私は Linux のソケットが初めてで、そのrecv()仕組みを理解しようとしています。説明が明確に見つからないシナリオを試しました。誰かが私を啓発してくれることを願っています。シナリオは次のとおりです。

TCP ソケットを使用して、2 つのプロセス (送信側と受信側) 間で 5 MiB のデータを送信します。Linux を実行している i.MX6 Sabrelite ボードでこれらのプロセスを実行します。

Sender.cpp:

char buffer[5MB];
send(sendSocket, (void*) buffer, 5 MiB, 0);

Receiver.cpp:

char buffer[5 MiB];
int count = 0;
do {
    rbytes = recv(receiveSocket, (void*) buffer, 5MB, 0);
    printf("Recv'd %d. %d\n",count,rbytes);
    count++;
} while (rbytes!=0);

受信前に関数呼び出しを使用してgetsockopt()、内部バッファーSO_RCVBUFサイズを取得しました。約 86 KiB でした。

recv()5 MiB を取得するのに何回の呼び出しが必要で、各recv()呼び出しのバイト数を確認したかったのです。

5 MiB を受信したら、出力を確認します。recv()5 MiB のデータを取得するには、ほぼ 48回の呼び出しが必要です。最初の 40 回の呼び出しでは、86 KiB 未満しか受信しませんでした。これは、受信したバイトが内部バッファーよりも少ないため意味があります。86 KiB の 2 倍を受け取った場合、カーネルは通常、 に示されているものの 2 倍を割り当てるという説明がありましたSO_RCVBUF

しかし、86 KiB の 2 倍よりも多くのバイトを受信して​​います。

SO_RCVBUFを使用してサイズを信頼できますgetsockopt()か?

値を動的に変更しますか?

同じシナリオをもう一度試してみました。呼び出し回数がrecv()異なります。しかし、受信したバイト数が割り当てられた数を超えることがあります。

4

1 に答える 1

1

このスレッドによると、カーネルは、SO_RCVBUF で要求した場合の 2 倍のバッファ スペースを割り当てます。

于 2013-03-07T07:18:10.980 に答える