我开发了一个包含 tcp 服务器的服务。
当我重新启动我的应用程序时,有时我的应用程序无法绑定(bind) TIME_WAIT 的端口原因。
在我的应用程序中,我想在绑定(bind)失败时添加一个过程。此过程应在开始时检查绑定(bind)失败的类型:
- 如果原因是由于
TIME_WAIT
,则稍等片刻 再试一次。 - 如果是因为端口被其他应用占用,则选择其他端口重试绑定(bind)
我如何知道绑定(bind)失败的类型?
注意:
- 我不想使用
SO_REUSEADDR
- 对于两种类型的失败,绑定(bind)
errno
是相同的
最佳答案
首先,我会在您的监听套接字上使用 SO_REUSEADDR
sockopt 来首先避免这种情况。 SO_REUSEADDR
将允许您在重新启动时重用您的 TCP 服务器之前使用的相同套接字,因为它仍由操作系统保持打开状态。
其次,错误处理始终是一个好主意。我鼓励您检查 bind
的返回值并处理您预计会遇到的最有可能的 errno
。您可以在手册页的第 2 部分中获取 bind
的 errno
列表。
$> man -s 2 bind
最后,TIME_WAIT
中套接字的 errno
与正在使用的地址相同 errno
:EADDRINUSE
。这是因为操作系统正在使用 TIME_WAIT
中的套接字。
关于c++ - 如何检查端口是否处于 TIME_WAIT 状态或已被另一个应用程序占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28273640/