演習の一環としてネットワーク スループットをテストする小さなプログラムを作成しており、(TCP のパフォーマンスを向上させるために) 送受信バッファーを 256 KB に増やす必要があります。SO_SNDBUF/SO_RCVBUF オプションを使用してこれを行ってsetsockopt()
おり、「net.core.rmem_max」と「net.core.wmem_max」の値も増やしました。
getsockopt() はバッファ サイズの増加 (256KB 値の 2 倍) を確認するので、これで問題ないことがわかります。ただし、あるホストから別のホストに256KBのデータを送信すると、受信者は常に、すべてのデータを受信するまで、さまざまなサイズの複数の読み取りで受信します(受信バイト数が1448から18824の範囲の20から40の読み取りの間のどこかから)。 . この時点で、主にこれらの質問でかなり混乱しましたが、
- バッファサイズが大きくなったので、1回の読み取りで受け取るべきではありませんか?
- また、各読み取りのバイト数が大きく異なるのはなぜですか (一定である必要はありません)。
- 1 回の読み取りで 256KB を確実に受信する方法はありますか?
以下は、読み取り部分を示す受信側のスニペットです。
while(1) {
memset(&client_addr, 0, sizeof(client_addr));
if ((connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) <= 0) {
perror("accept()");
exit(EXIT_FAILURE);
}
while ((n = recv(connfd, &buff[0], BUFF_SIZE, 0/*MSG_WAITALL*/)) > 0) {
totalBytes += n;
++pktCount;
printf("Received(%d): %d bytes\n", pktCount, n);
}
if (n == 0) {
printf("Connection closed (Total: %lu bytes received)\n", totalBytes);
}
close(connfd);
connfd = -1;
totalBytes = 0;
pktCount = 0;
}
どんな助けでも素晴らしいでしょう。
ティア