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 之前调用

相关推荐
Boom_Shu7 分钟前
长方形的关系
数据结构·c++·算法
思麟呀1 小时前
C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
linux·开发语言·jvm·c++·windows
Lumbrologist1 小时前
【C++】零基础入门 · 第 13 节:类与对象基础
java·c++·算法
吴可可1233 小时前
CAD2004自定义实体开发环境配置
c++·算法
L_09073 小时前
【C++】C++11 新特性
开发语言·c++
Fanfanaas3 小时前
C++ 继承
java·开发语言·jvm·c++·学习·算法
十五年专注C++开发3 小时前
cereal 库:C++ 序列化的轻量之选
开发语言·c++·序列化·反序列化·cereal
lqqjuly3 小时前
设计模式:理论、架构与 C++ 实现—SOLID原则到23 种经典模式
c++·设计模式·架构
BestOrNothing_20153 小时前
C++零基础到工程实战(5.2.8)多文件声明定义函数和全局变量
c++·c++多文件编译·.h头文件·.cpp·函数声明定义
星卯教育tony4 小时前
2026年全国青少年信息素养大赛主题应用 数字守艺人 丝路新城 星火征程 智传民韵 c++ python scratch 所有真题免费分享
开发语言·c++