int reuseaddr = 1;
int r = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&reuseaddr, sizeof(reuseaddr));
SO_REUSEADDR 可以用在以下 4 种情况下。 (摘自《Unix网络编程》卷一,即UNPv1)
- 当有一个有相同本地地址和端口的 socket1 处于 TIME_WAIT 状态时,而你启动的程序的 socket2 要占用该地址和端口,你的程序就要用到该选项。(开启该功能时, server 关闭时可以立刻重启 server 的功能。)
- SO_REUSEADDR 允许同一 Port 上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用 IP Alias 技术的机器可以测试这种情况。
- SO_REUSEADDR 允许单个进程绑定相同的端口到多个 socket 上,但每个 socket 绑定的 ip 地址不同。这和 2很相似,区别请看UNPv1。
- SO_REUSEADDR 允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。
(SAW:Game Over!)