4
int n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
    printf("Get socket option failed, errno: %d\n",errno);
}
else
{
    printf("Current socket buff len = %d\n", n);
}
n = 225280;
if(0 != setsockopt(iSockFd, SOL_SOCKET, SO_RCVBUF, (const void *)&n, sizeof(n)))
{
    printf("setsock err errno %d\n", errno);
}
else
{
    printf("setsock opt success\n");
}
n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
    printf("Get socket option failed, errno: %d\n",errno);
}
else
{
    printf("After setting socket buff len = %d\n", n);
}

出力は -

現在のソケット バフ len = 41600

セットソケットの選択の成功

socket buff len = 41600 を設定した後。

受信バッファ サイズが増加していないように見えますが、これが発生する理由は何ですか?

前もって感謝します!

4

2 に答える 2

3

カーネルが新しいバージョン (2.6.17 以降) の場合は、ファイル /proc/sys/net/ipv4/tcp_moderate_rcvbuf を確認して、自動チューニングが有効になっているかどうかを確認します。tcp_moderate_rcvbuf の値が 1 の場合、自動チューニングが有効になっています。このようなシナリオでは、受信バッファーはカーネルによって動的に更新され、/proc/sys/net/ipv4/tcp_rmem の値にバインドされます。この制限に達しているかどうかを確認します。

カーネルが古いバージョンの場合、SO_RCVBUF が /proc/sys/net/core/rmem_default および /proc/sys/net/core/rmem_max の値によって制限されているかどうかを確認します。TCP の場合は、/proc/sys/net/ipv4/tcp_rmem の値も確認してください。

また、「setsockopt() を使用してソケット バッファ サイズを手動で調整すると、自動チューニングが無効になる」ことにも注意してください。Linux のチューニングに関する適切なリンクは次のとおりですhttp://www.psc.edu/index.php/networking/641-tcp-tune

于 2015-11-18T18:18:41.193 に答える