setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));

int j=1;

setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));

bind(server_sockfd,(struct sockaddr *)&server_add,server_len);

默认情况下,两个独立的套接字不可与同一本地接口(在TCP/IP情况下,则是端口)绑定在一起。但是少数情况下,还是需要使用这种方式,来实现对一个地址的重复使用。设置了这个套接字,服务器便可在重新启动之后,在相同的本地接口以端口上进行监听。

一般来说一个端口释放后会等待两分钟之后才能再被使用SO_REUSEADDR是让端口释放后立即就可以被再次使用。     SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket允许重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。

SO_REUSEADDR提供如下四个功能:

    SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现若不设置此选项则bind时将出错。

    SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例只要每个实例捆绑一个不同的本地IP地址即可。对于TCP我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。

    SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。

    SO_REUSEADDR 允许完全重复的捆绑:当一个 IP 地址和端口绑定到某个套接口上时 还允许此IP 地址和端口捆绑到另一个套接口上。

这边使用的是第四个功能。


你可能感兴趣的:(setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));)