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

相关推荐
2601_956121976 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-8 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
小星星闪亮登场10 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑10 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶10 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ11 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
别动我齐刘海12 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
Henry Zhu12313 小时前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
June`16 小时前
warp shuffle指令
c++·人工智能·算法·cuda
2401_8734794016 小时前
IPv6查出来的地理位置是错的?用双栈IP库解决定位偏差问题
网络·数据库·tcp/ip·ip