【问题标题】:how to check if a port is free in linux using c如何使用c检查Linux中端口是否空闲
【发布时间】:2014-07-28 06:17:34
【问题描述】:

我从来没有写过类似的东西, 我如何使用c程序检查端口是否为空 在 Linux 环境下 非常感谢。

ps 正在寻找一种方法,不使用 bind 或 connect 并检查它是否失败。

编辑 我无法使用绑定或连接,正在寻找更快的方法来找到连续空闲的 3k 端口

【问题讨论】:

  • 这里的链接stackoverflow.com/a/10294941/2959769 解释了这如何导致竞争状况
  • 请记住端口不只是“开放”和“封闭”。它们受接口和协议的约束。您可以让一个应用程序在接口lo 中打开端口 80 TCP,另一个应用程序在同一接口中打开相同的端口但 UDP,以及其他两个应用程序在接口eth0 中执行相同的操作等。相同的端口由许多不同的打开服务器,他们都会对此感到满意。
  • 相关:unix.stackexchange.com/a/15513/31228 建议保留连续端口范围的策略。
  • @VinayShukla 对于许多应用程序,例如,在只有服务运行且没有用户启动连接的服务器上,这种竞争条件发生的可能性非常低,值得冒险采取任何策略用于检查空闲端口,无论是否实际绑定到它们。

标签: c linux


【解决方案1】:

更好的方法是使用下一个空闲端口,你也可以使用0端口绑定将使用下一个可用端口。

您可以通过以下代码获取bind()选择的端口

struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sock, (struct sockaddr *)&sin, &len) != -1)
  printf("port number %d\n", ntohs(sin.sin_port)); 

更多信息请参考How to bind to any available port?

【讨论】:

    【解决方案2】:

    使用 system() 或 popen() 运行以下命令

    netstat -antu
    

    它将列出您机器上所有使用的端口。 您需要解析该命令的输出,然后您将获得所有繁忙端口的列表。

    【讨论】:

    • 我认为这不是在解析时这样做的恰当方式,可能与端口的连接已关闭并且它变得免费。
    • 是的,在这种情况下,这样做的优化方式并不多。通常我会使用检查绑定或连接来检查端口,但 OP 不希望这样。
    • 太好了,我希望它会起作用,我去 matlab 制作了这个程序,因为我不知道我在 c 中有系统命令
    • 乐于助人。在 Linux 机器上的 C 中,您需要包含 stdlib.h 才能使用 system()。
    • @Mr.32 还有system容易用错,导致漏洞。例如,如果进程以特权运行并省略了netstat 的绝对路径(就像在这个答案中一样),用户可能会在进程的PATH 中放置一个名为netstat 的恶意可执行文件,使其以特权运行。其他问题包括调用 netstat 的可执行文件的平台相关输出(我想 BSD netstat 有不同的输出,如果它存在的话)
    【解决方案3】:

    你直接使用bind()怎么样,如果不成功你可以尝试另一个端口。

    你刚刚检查了一个端口是空闲的,但是有人已经使用了它会是一个竞争条件,所以检查一个端口是否空闲然后绑定它是不可能的

    您也可以阅读/proc/net/tcp 寻求帮助,但仍可能发生竞争情况。

    【讨论】:

    • OP 说不用bind/connect
    • 我同意,我建议他另一种解决方案,因为上述灵魂可能会导致竞争状况
    【解决方案4】:

    我有同样的问题 问题是你需要检查一个端口还是多个端口

    如果您只需要检查一个或几个使用 bind,如果它有效,那么它是免费的(不要忘记释放套接字)

    如果您像我一样需要检查许多端口,那么对我有用的是运行 system('netstat -tulpn') 并将输出重定向到文件/变量 然后在此信息上搜索“:{yourport}”

    为我工作

    ps 如果像我一样需要让它们保持空闲,请告诉您的计算机不要在该区域随机分配端口

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多