web-dev-qa-db-ja.com

Linuxでの実行時のUDP受信バッファーサイズの指定

Linuxでは、次のコマンドを使用して、システムパケットのデフォルトの受信バッファーサイズ(UDPなど)を指定できます。

sysctl -w net.core.rmem_max=<value>
sysctl -w net.core.rmem_default=<value>

しかし、私が疑問に思うのは、アプリケーション(たとえばc内)が、実行時にUDPソケットごとの受信バッファーサイズを指定することにより、システムのデフォルトをオーバーライドすることは可能ですか?

26
Mαzen

デフォルトから値を増やすことはできますが、最大値を超えて増やすことはできません。 setsockopt を使用して、SO_RCVBUFオプションを変更します。

int n = 1024 * 1024;
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) {
  // deal with failure, or ignore if you can live with the default size
}

これはポータブルソリューションであることに注意してください。受信バッファーサイズを増やすために任意のPOSIXプラットフォームで動作するはずです。 Linuxには、しばらくの間 autotuning (2.6.7以降、および 妥当な最大バッファーサイズ 2.6.17以降)があり、これは負荷に基づいて受信バッファーサイズを自動的に調整します。自動調整のあるカーネルでは、setsockoptを使用して受信バッファーサイズを設定しないことをお勧めします。これを行うと、カーネルの自動調整が無効になります。ただし、他のプラットフォームでは、setsockoptを使用してバッファサイズを調整する必要がある場合があります。

29
Brian Campbell