在套接字编程中如何知道一个端口是打开还是关闭的?

4
如果一个套接字程序在某个端口运行(例如6053),但是如果规则没有被添加到防火墙中,则recvreadrecvfrom函数会被阻止。
我们如何在Linux机器上用Cpython检查并报告端口未打开错误?

您将无法连接套接字,并且在超时后会收到异常。 - Klaus D.
你是否有兴趣确定某个IP规则是否阻止了对某个端口的数据包传输,或者确定该端口是否已绑定到程序并准备好接收数据包? - Prabhu
2个回答

3
尝试使用socket.connect()连接该端口,如果连接不成功,则显示“端口未打开”的消息。

2
连接失败也有其他原因吧?使用UDP呢? - Ramana Reddy
2
但请确保使用您的以太网/WLAN接口的IP地址,因为它可能会有比“localhost”更严格的规则。 - glglgl
1
你必须检查错误以了解连接失败的原因。在 C 中,你将不得不检查 errno(原因可能是仍在使用、权限被拒绝、没有人在监听(和其他原因))。 - hexasoft

1

像nmap这样的工具可以帮助确定特定端口是开放还是关闭。

TCP : nmap使用TCP SYN扫描或TCP Connect扫描等技术,如果端口关闭,则服务器将在SYN请求的情况下回复ACK-RST数据包。您可以注意到,在三次握手(连接建立)时就已确定。

UDP : nmap还提供UDP扫描,其中基于ICMP的“端口不可达”数据包将在UDP包到达关闭的UDP端口时返回(这也取决于操作系统中的堆栈)。与TCP不同,UDP不是基于连接的协议,而且ICMP也是无连接的,因此您可能需要发送一些显着数量的UDP数据包,以短时间间隔为基础进行评估并根据响应或某些类似逻辑进行评估。

您可以采用类似的技术/逻辑,并确定特定端口是开放还是关闭,并为用户闪存适当的消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接