Unix Network Programming: Chap7

Dec 15, 2022 00:04 · 110 words · 1 minute read

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

あっていそう。