我如何检查端口是处于TIME_WAIT状态还是已被其他应用程序占用

时间:2015-02-02 08:28:14

标签: c++ c linux sockets unix

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

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

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

  1. 如果原因是TIME_WAIT,那么等待amoment和 再试一次。
  2. 如果原因是该端口被另一个应用程序占用,则选择另一个端口并重试绑定
  3. 我怎么知道绑定的类型失败?

    注意:

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

2 个答案:

答案 0 :(得分:2)

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

其次,错误处理总是一个好主意。我建议您检查bind的返回值,并处理您希望遇到的最可能的errno。您可以在手册页的第2部分中获取errno的{​​{1}}列表。

bind

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

答案 1 :(得分:-1)

您可以查看并等待以下代码。

var="$(netstat -ant|grep <portnumber>|awk '{print$6}')"
if [ "$var" == "TIME_WAIT" ] ;then
sleep 5