Linuxでgetsockopt関数とsetsockopt関数の使い方
getsockopt関数はソケットオプションの現在の値を取得するのに対し、setsockopt関数はソケットオプションの値を設定するために使用します。使い方を以下に示します。
getsockopt関数のプロトタイプ:int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
パラメータの解説:
- ソケットディスクリプタ: sockfd
- レベル:プロトコル層の中のオプション
- オプション名
- オプション値を格納するためのバッファ
- 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);
パラメータの説明:
- sockfd: ソケット記述子
- レベルは、オプションが属するプロトコル層のことです。
- オプション名:オプションの名前
- optval:オプション値の入ったバッファを指す
- バッファーの長さ 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 オプション) のリンクを行う必要があります。