7.ソケットオプション 🔗
この章は、新しい概念の導入や実装テクニックの習得ではなく、ソケットファイルの挙動を制御するためのソケットオプションの紹介がメインであり、本文にもリファレンス的に使われることを想定している旨の記述がある。
要約しようにも、単なる転記作業になってしまうので、この章は演習だけを行うことにする。
TCP/UDPの送受信バッファサイズのデフォルト値を印字するプログラムを実装する。 🔗
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
int main() {
// TCPソケットを作る。
int fd = socket(AF_INET, SOCK_STREAM, 0);
// 送受信バッファの値-結果引数のデータ型は int。
int val;
// Macは LP64 データモデルなので、int は 32bit のはず。
socklen_t len = sizeof(val);
// せっかくなので確認しておく。
// 4になるはず。
printf("bufsize=%d\n", len);
printf("=== SO_SNDBUF ===\n");
if(getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *)&val, &len) == -1)
printf("error");
// int 型に書き込むので、変化しないはず。
printf("wrote=%d\n", len);
printf("value=%d\n", val);
printf("=== SO_RCVBUF ===\n");
if(getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&val, &len) == -1)
printf("error");
// int 型に書き込むので、変化しないはず。
printf("wrote=%d\n", len);
printf("value=%d\n", val);
}
これを実行すると以下になる。
❯ ./a.out
bufsize=4
=== SO_SNDBUF ===
wrote=4
value=16384
=== SO_RCVBUF ===
wrote=4
value=131072
答え合わせをしておく。送受信バッファサイズはそれぞれ
- 受信:
/proc/sys/net/ipv4/tcp_rmem - 送信:
/proc/sys/net/ipv4/tcp_wmem
に書いてあるので、これをみてみると、
❯ cat /proc/sys/net/ipv4/tcp_{w,r}mem
4096 16384 4194304
4096 131072 6291456
あっていそう。