从手册页:
SO_REUSEADDR指定规则 用于验证提供的地址 bind()应该允许重用本地 地址,如果这支持 协议。此选项采用int 值。这是一个布尔选项
我什么时候应该使用它?为什么“重用本地地址”会给出?
答案 0 :(得分:114)
答案 1 :(得分:25)
SO_REUSEADDR允许您的服务器 绑定到一个地址 TIME_WAIT状态。
此套接字选项告诉内核即使此端口正忙(处于TIME_WAIT状态),仍然继续并重新使用它。如果它很忙,但是有另一个状态,你仍然会得到一个已经处于使用中的地址错误。如果您的服务器已关闭,然后在其端口上的套接字仍处于活动状态时立即重新启动,则此功能非常有用。
答案 2 :(得分:7)
创建套接字时,您并不真正拥有它。操作系统(TCP堆栈)为您创建它,并为您提供一个句柄(文件描述符)来访问它。当您的套接字关闭时,操作系统在经历多个状态时需要一段时间“完全关闭它”。正如EJP在评论中提到的,最长的延迟通常来自TIME_WAIT状态。在终止序列的最后处理边缘情况需要这个额外的延迟,并确保最后一个终止确认通过或由于超时而使另一侧自身重置。 Here you can find关于这种状态的一些额外考虑。主要考虑因素如下:
请记住,TCP保证所有传输的数据都会被传递, 如果可能的话。关闭套接字时,服务器进入 TIME_WAIT状态,只是为了真正确定所有数据都有 经历了。当插座关闭时,双方都同意发送 相互之间的消息,他们将不再发送数据。这个,它 对我来说似乎已经足够好了,握手完成之后 套接字应该关闭。问题是双重的。首先,没有 确保最后一个ack成功通信的方法。 其次,网上可能还有“游荡重复” 如果交付,则予以处理。
如果您尝试使用相同的ip:port对创建多个套接字非常快,则会得到“已在使用的地址”错误,因为早期的套接字不会完全释放。使用SO_REUSEADDR将消除此错误,因为它将覆盖任何先前实例的检查。