【发布时间】:2015-04-01 03:46:12
【问题描述】:
我开发了一个包含 tcp 服务器的服务。
当我重新启动我的应用程序时,有时我的应用程序由于TIME_WAIT 原因无法绑定端口。
在我的应用程序中,我想在绑定失败时添加一个过程。此过程应在开始时检查绑定类型是否失败:
- 如果是
TIME_WAIT的原因,请稍等, 重试。 - 如果原因是该端口被其他应用程序占用,则选择另一个端口并重试绑定
我如何知道绑定失败的类型?
注意:
- 我不想使用
SO_REUSEADDR - 绑定
errno对于两种失败类型都是相同的
【问题讨论】:
-
如果您使用
SO_REUSEADDR,您将避免由于TIME_WAIT而导致的错误,而不是由于LISTEN而导致的错误,但我对您尝试其他端口的建议感到困惑。选择另一个端口有什么价值?客户端如何知道端口是什么? -
@EPJ,对于我的用例,只有一个客户端,并且有一种方法可以通知客户端使用的端口。无论如何,这不是问题
-
好的,那么为什么你不想使用 SO_REUSEADDR?这就是答案。它完全满足你的需要。