私は 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()
異なります。しかし、受信したバイト数が割り当てられた数を超えることがあります。