如果tcp下不使用SO_REUSEADDR
1.进程创建监听套接字socket1,并且建立了多个连接时。此时进程创建另一个套接字socket2,试图band同一个端口的时候,会报“Address already in use”的错误。
2.杀死上述进程,重新启动,调用band重新绑定,建立套接字监听。这次邦定只有在bind前(两个socket绑定之前都需要指定)指定了SO_REUSEADDR时才能成功。
(因为直接杀进程,没有显式关闭套接字来释放端口,会等待一段时间后才可以重新use这个关口,解决办法就是用SO_REUSEADDR)
端口复用最常用的用途应该是防止服务器重启时之前绑定的端口还未释放或者程序突然退出而系统没有释放端口。这种情况下如果设定了端口复用,则新启动的服务器进程可以直接绑定端口。如果没有设定端口复用,绑定会失败,提示ADDR已经在使用中。
SO_REUSEADDR提供如下四个功能:
SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。(针对tcp用法)
SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号