SO_REUSEADDR(setsockopt选项)是什么意思 - Linux?

时间:2010-07-12 15:42:49

标签: linux sockets port ip-address setsockopt

从手册页:

  

SO_REUSEADDR指定规则   用于验证提供的地址   bind()应该允许重用本地   地址,如果这支持   协议。此选项采用int   值。这是一个布尔选项

我什么时候应该使用它?为什么“重用本地地址”会给出?

3 个答案:

答案 0 :(得分:114)

答案 1 :(得分:25)

  

SO_REUSEADDR允许您的服务器   绑定到一个地址   TIME_WAIT状态。

此套接字选项告诉内核即使此端口正忙(处于TIME_WAIT状态),仍然继续并重新使用它。如果它很忙,但是有另一个状态,你仍然会得到一个已经处于使用中的地址错误。如果您的服务器已关闭,然后在其端口上的套接字仍处于活动状态时立即重新启动,则此功能非常有用。

来自unixguide.net

答案 2 :(得分:7)

创建套接字时,您并不真正拥有它。操作系统(TCP堆栈)为您创建它,并为您提供一个句柄(文件描述符)来访问它。当您的套接字关闭时,操作系统在经历多个状态时需要一段时间“完全关闭它”。正如EJP在评论中提到的,最长的延迟通常来自TIME_WAIT状态。在终止序列的最后处理边缘情况需要这个额外的延迟,并确保最后一个终止确认通过或由于超时而使另一侧自身重置。 Here you can find关于这种状态的一些额外考虑。主要考虑因素如下:

  

请记住,TCP保证所有传输的数据都会被传递,   如果可能的话。关闭套接字时,服务器进入   TIME_WAIT状态,只是为了真正确定所有数据都有   经历了。当插座关闭时,双方都同意发送   相互之间的消息,他们将不再发送数据。这个,它   对我来说似乎已经足够好了,握手完成之后   套接字应该关闭。问题是双重的。首先,没有   确保最后一个ack成功通信的方法。   其次,网上可能还有“游荡重复”   如果交付,则予以处理。

如果您尝试使用相同的ip:port对创建多个套接字非常快,则会得到“已在使用的地址”错误,因为早期的套接字不会完全释放。使用SO_REUSEADDR将消除此错误,因为它将覆盖任何先前实例的检查。