理解 setsockopt 函数

理解 setsockopt 函数 一、setsockopt作用是 Linux/Unix 网络编程中非常核心的函数作用是设置套接字socket的选项参数用来控制 socket 的各种行为。简单说你创建了一个 socket相当于网络通信的“通道”setsockopt 就是给这个通道设置开关、超时、缓存、复用、广播等功能二、函数原型C语言#include sys/socket.hint setsockopt(int sockfd, // 要设置的 socket 文件描述符int level, // 选项级别TCP层 / IP层 / Socket层int optname, // 具体选项名 const void *optval, // 选项的值指针socklen_t optlen // 值的长度);返回值成功返回 0失败返回 -1并设置 errno三、三个关键参数最容易懵1. level选项级别决定你要改哪一层的配置SOL_SOCKET最常用修改 socket 本身的通用属性如端口复用、广播、超时IPPROTO_TCP修改 TCP 协议属性IPPROTO_IP修改 IP 协议属性2. optname具体选项最常用的几个新手必记SO_REUSEADDR端口复用崩溃后快速重启最常用SO_REUSEPORT端口完全复用多进程共享端口SO_SNDBUF / SO_RCVBUF发送/接收缓冲区大小SO_BROADCAST允许广播SO_RCVTIMEO / SO_SNDTIMEO接收/发送超时3. optval就是你要设置的值通常是int on 1; 表示开启int on 0; 表示关闭四、最经典、最实用的例子端口复用必学场景服务器程序崩溃、重启时提示 Address already in use地址被占用因为 TCP 有 TIME_WAIT 状态端口会被占用几分钟。用 setsockopt 开启 SO_REUSEADDR 就能解决。完整可运行代码C语言#include stdio.h#include stdlib.h#include sys/socket.h#include netinet/in.hint main() {// 1. 创建 TCP socketint server_fd socket(AF_INET, SOCK_STREAM, 0);if (server_fd -1) { perror(socket failed); return -1; }// // setsockopt 核心用法// int on 1; // 1开启0关闭int ret setsockopt(server_fd, // socketSOL_SOCKET, // 级别socket 通用层SO_REUSEADDR, // 选项端口复用on, // 值开启sizeof(on) // 值长度 );if (ret -1) {perror(setsockopt failed);close(server_fd);return -1;}printf(端口复用设置成功\n);// 下面是正常绑定、监听代码struct sockaddr_in addr;addr.sin_family AF_INET;addr.sin_port htons(8080);addr.sin_addr.s_addr INADDR_ANY;if (bind(server_fd, (struct sockaddr*)addr, sizeof(addr)) -1) {perror(bind failed);close(server_fd);return -1;}listen(server_fd, 10);printf(服务器监听 8080 端口...\n);getchar(); // 暂停close(server_fd);return 0;}编译运行gcc test.c -o server./server效果即使程序异常退出立刻重启也不会报端口占用。五、再举一个常用例子设置接收超时让 recv() 等待数据时最多等 5 秒超时就返回。struct timeval timeout;timeout.tv_sec 5; // 秒timeout.tv_usec 0; // 微秒setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO, // 接收超时timeout,sizeof(timeout));六、一句话总结用法// 固定格式 int 开关 1; setsockopt(套接字, 级别, 选项名, 开关, sizeof(开关));想开启某个功能 → 传 1想关闭 → 传 0总结setsockopt 设置 socket 行为最常用级别SOL_SOCKET最常用选项SO_REUSEADDR端口复用格式固定只需要改选项名和值如果你需要我还可以给你Python / Java 版本的 setsockopt 例子所有常用选项清单带中文解释服务端编程完整模板包含所有最佳 setsockopt 配置参考链接 0voice · GitHub