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