有没有办法以编程方式识别 tcp 连接/端口的状态?

Posted

技术标签:

【中文标题】有没有办法以编程方式识别 tcp 连接/端口的状态?【英文标题】:Is there a way to programatically identify the status of a tcp connection/port? 【发布时间】:2018-06-20 11:24:59 【问题描述】:

看到$DISPLAY环境变量得到一个端口,需要检查当前程序运行的vnc是否连接。

❯ netstat -an --tcp | grep 5902
tcp        0      0 0.0.0.0:5902            0.0.0.0:*               LISTEN 

以上是netstat输出。

在为端口建立 tcp 连接时,输出如下:

$ netstat -an --tcp | grep 5902
tcp        0      0 0.0.0.0:5902            0.0.0.0:*               LISTEN     
tcp        0      0 172.16.100.219:5902     172.16.100.129:35542    ESTABLISHED

可以从 C/c++ 代码中调用 netstat,例如

port = process_display(std::getenv("DISPLAY"))
is_connected = call_this("netstat -anp | grep <porttocheck> | grep ESTABLISHED | wc -l");

我需要is_connected 并做一些逻辑。

但是,这取决于多种因素,如果程序要在不同的机器上运行,我宁愿不依赖于从代码中调用 netstat。

有没有更好的方法来检查端口是否已建立 TCP 连接,从 C 代码?解析 /proc/ 或类似的东西看起来也很笨拙。

我可以接受仅限 linux 的解决方案。

【问题讨论】:

不幸的是,我知道没有一种简洁的方法可以列出一台机器上的所有当前网络连接。这确实是可能的,因为 netstat 做到了,但我担心在 Linux 上它是通过使用非常低级的数据来做到这一点的。恕我直言,你能做的最好的就是查看 netstat 源代码,看看你是喜欢模仿它还是直接调用 netstat 程序 This 可能会对您有所帮助。 仅适用于 Linux,我在过去阅读 /proc/net/tcp 和/或 /proc/net/tcp6 时这样做了。你有套接字本地和远程地址和状态,应该足够了。 【参考方案1】:

我认为您可以使用您想要其状态的端口创建一个套接字。如果套接字成功创建,则意味着端口已关闭,否则端口已打开。 like this

【讨论】:

以上是关于有没有办法以编程方式识别 tcp 连接/端口的状态?的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议端口状态说明

以编程方式读取 IIS 7 网站的 TCP 端口

QQ 为什么以 UDP 协议为主,以 TCP 协议为辅?

TCP 端口访问和 C++

有没有办法通过 iOS/swift 中的蓝牙以编程方式连接 android 和 IOS 设备?

以编程方式识别何时创建或终止微服务的新实例?