gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:58 32 4
gpt4 key购买 nike

我开发了一个包含 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com