设置socket选项SO_REUSEADDR

📅 发布时间:2026/7/11 6:23:51 👁️ 浏览次数:
设置socket选项SO_REUSEADDR
服务器监听socket通常会设置socket选项SO_REUSEADDR即端口、ip可重用。代码如下:int reuse 1; int ret setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)reuse, sizeof(reuse));为什么会设置这个选项呢?先说结论服务器监听 socket 设置 SO_REUSEADDR是为了解决重启服务器时端口因 TIME_WAIT 状态被占用导致监听失败的问题。回答这个问题要理解tcp的4次挥手第一步主动关闭方(A)先发送FIN包进入FIN_WAIT_1状态第二步被动关闭方(B)收到FIN回复ACK包B进入CLOSE_WAIT状态第三步被动关闭放(B)发送FIN包, B进入LAST_ACK状态第四步主动关闭放(A)收到FIN包回复ACK包A进入TIME_WAIT状态通常2MSLB收到ACK包直接关闭第五步2MSL超时后A从TIME_WAIT进入CLOSED状态端口释放。在第四步时端口是占用状态新的监听socket无法绑定该端口会失败。选项的作用设置SO_REUSEADDR后允许新的监听socket绑定处于TIME_WAIT状态的端口让服务器能快速重启。