【问题标题】:How I can check if a port is in TIME_WAIT status or already taken by another application如何检查端口是否处于 TIME_WAIT 状态或已被另一个应用程序占用
【发布时间】:2015-04-01 03:46:12
【问题描述】:

我开发了一个包含 tcp 服务器的服务。

当我重新启动我的应用程序时,有时我的应用程序由于TIME_WAIT 原因无法绑定端口。

在我的应用程序中,我想在绑定失败时添加一个过程。此过程应在开始时检查绑定类型是否失败:

  1. 如果是TIME_WAIT的原因,请稍等, 重试。
  2. 如果原因是该端口被其他应用程序占用,则选择另一个端口并重试绑定

我如何知道绑定失败的类型?

注意:

  1. 我不想使用SO_REUSEADDR
  2. 绑定 errno 对于两种失败类型都是相同的

【问题讨论】:

  • 如果您使用SO_REUSEADDR,您将避免由于TIME_WAIT 而导致的错误,而不是由于LISTEN 而导致的错误,但我对您尝试其他端口的建议感到困惑。选择另一个端口有什么价值?客户端如何知道端口是什么?
  • @EPJ,对于我的用例,只有一个客户端,并且有一种方法可以通知客户端使用的端口。无论如何,这不是问题
  • 好的,那么为什么你不想使用 SO_REUSEADDR?这就是答案。它完全满足你的需要。

标签: c++ c linux sockets unix


【解决方案1】:

首先,我会在你的监听套接字上使用SO_REUSEADDR sockopt 来避免这种情况。 SO_REUSEADDR 将允许您在重新启动时重用您的 TCP 服务器之前使用的同一个套接字,因为它仍然被操作系统保持打开状态。

其次,错误处理总是一个好主意。我鼓励您检查bind 的返回值并处理您期望遇到的最有可能遇到的errno。您可以在手册页的第 2 部分中获取 binderrno 列表。

$> man -s 2 bind

最后,TIME_WAIT 中套接字的errno 与使用中的地址errno 相同:EADDRINUSE。这是因为操作系统正在使用TIME_WAIT 中的套接字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 2016-08-14
    • 1970-01-01
    • 2018-02-21
    • 2010-11-06
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多