setsockopt()详解

一、setsockopt() 是什么?

是:

设置 socket 选项(Socket Options)

作用:

让你修改内核中这个 socket 的行为。

函数原型:

cpp 复制代码
int setsockopt(
    int sockfd,
    int level,
    int optname,
    const void *optval,
    socklen_t optlen
);

二、下面这段代码在干什么?(在实际工程里几乎都会出现)

cpp 复制代码
int opt = 1;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

意思是:

允许端口地址复用

简单说:

让服务器可以立即重新绑定同一个端口

三、不写会发生什么?
场景:

服务器运行在 8080

Ctrl+C 关闭

马上重新运行

可能出现错误:

复制代码
bind: Address already in use

为什么?

因为 TCP 有一个状态:

复制代码
TIME_WAIT

即使程序退出,端口还被内核保留一段时间(通常1~4分钟)。

四、SO_REUSEADDR 的作用
设置后:
允许立即重新使用端口

开发服务器时非常重要,否则你会一直遇到:

复制代码
bind失败

五、setsockopt 参数逐个解释(重点)
1. sockfd

cpp 复制代码
listen_fd

要设置选项的 socket。

2. level

cpp 复制代码
SOL_SOCKET

表示:

在 socket 层设置选项

还有其他层,例如:

cpp 复制代码
IPPROTO_TCP
IPPROTO_IP

但最常用的是

cpp 复制代码
SOL_SOCKET

3. optname

cpp 复制代码
SO_REUSEADDR

选项名称。

常见选项:

4. optval

cpp 复制代码
&opt

选项值的地址。

这里:

复制代码
opt = 1  → 开启
opt = 0  → 关闭

5. optlen

cpp 复制代码
sizeof(opt)

值的大小(字节数)

六、系统底层为什么需要这个?

TCP关闭流程:

复制代码
主动关闭的一方进入 TIME_WAIT

目的是:

确保最后一个ACK能到达

防止旧数据影响新连接

但开发服务器时:

我们知道自己要重新启动服务

所以可以安全复用端口。

七、服务器中标准写法

工程中几乎固定写法:

cpp 复制代码
int listen_fd = socket(AF_INET, SOCK_STREAM, 0);

int opt = 1;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

bind(listen_fd, ...);
listen(listen_fd, 5);

顺序注意:

必须在 bind 之前调用

相关推荐
Lazionr15 小时前
模板进阶:深入理解模板机制
c++·windows
豆沙沙包?1 天前
C++~~~stack容器、queue容器、list容器(p45-P56)
c++·windows·list
Frank_refuel1 天前
【C++八股】面向对象
开发语言·c++
h_a_o777oah1 天前
【图论】Tarjan 缩点:解决有向图中环的问题
c++·算法·图论·acm·强连通分量·缩点·tarjan
别动我齐刘海1 天前
机器人运动控制学习4——状态估计 State Estimation
c++·人工智能·学习·目标检测·机器学习·机器人·自动驾驶
学习星球1 天前
OpenHarness 全面配置教学——从游戏开发工作流引入
c++·游戏·ai·ai编程
wWYy.1 天前
C++与C的区别
c语言·c++
程序员与背包客_CoderZ1 天前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
进击的_鹏1 天前
从零开始的 Redis 学习
服务器·数据库·c++·redis·缓存
实心儿儿1 天前
Linux —— 传输层协议TCP
linux·服务器·tcp/ip