Linuxでgetsockopt関数とsetsockopt関数の使い方

getsockopt関数はソケットオプションの現在の値を取得するのに対し、setsockopt関数はソケットオプションの値を設定するために使用します。使い方を以下に示します。

getsockopt関数のプロトタイプ:int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

パラメータの解説:

  1. ソケットディスクリプタ: sockfd
  2. レベル:プロトコル層の中のオプション
  3. オプション名
  4. オプション値を格納するためのバッファ
  5. optlen: 入力時はoptvalバッファーの長さ、出力時は実際に取得したオプション値の長さ

サンプルコード:

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>

int main() {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    int optval;
    socklen_t optlen = sizeof(optval);

    // 获取TCP_NODELAY选项的当前值
    getsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &optval, &optlen);
    printf("TCP_NODELAY: %d\n", optval);

    // 获取SO_RCVBUF选项的当前值
    getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);
    printf("SO_RCVBUF: %d\n", optval);

    return 0;
}

setsockopt関数のプロトタイプ:int setsockopt(int sockfd, int レベル, int optname, const void *optval, socklen_t optlen);

パラメータの説明:

  1. sockfd: ソケット記述子
  2. レベルは、オプションが属するプロトコル層のことです。
  3. オプション名:オプションの名前
  4. optval:オプション値の入ったバッファを指す
  5. バッファーの長さ optval

サンプルコード:

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>

int main() {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    int optval = 1;
    socklen_t optlen = sizeof(optval);

    // 设置TCP_NODELAY选项为1
    setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &optval, optlen);

    // 设置SO_RCVBUF选项为8192
    optval = 8192;
    setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, optlen);

    return 0;
}

これらの関数を使用する際は、関連するヘッダーファイル(sys/socket.h やnetinet/in.h 等) をインクルードし、コンパイル時に関連するライブラリ(例: -lsocket オプション) のリンクを行う必要があります。

bannerAds