c++ - 如何检查端口是否处于 TIME_WAIT 状态或已被另一个应用程序占用

标签 c++ c linux sockets unix

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

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

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

  1. 如果原因是由于 TIME_WAIT,则稍等片刻 再试一次。
  2. 如果是因为端口被其他应用占用,则选择其他端口重试绑定(bind)

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

注意:

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

最佳答案

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

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

$> man -s 2 bind

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

关于c++ - 如何检查端口是否处于 TIME_WAIT 状态或已被另一个应用程序占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28273640/

相关文章:

linux - 如何计算Shell中重复的句子

c# - 以编程方式制定图像轮廓(最好是 C#/C++ 编码,或伪编码)

linux - 有 libXrandr API 文档吗?

c++ - 从字符串中读取所有整数 C++

计算数组中元素的数量 - C

c - findAndReplace函数的实现

linux - p7zip 64 位二进制文​​件

linux - 打开屏幕在bash文件中获取PID

c++ - Makefile 和链接 .a 库

c++ - LEX:段错误:11