【问题标题】:How to know whether a port is open/close in socket programming?如何知道套接字编程中端口是否打开/关闭?
【发布时间】:2016-02-15 01:07:28
【问题描述】:

如果一个套接字程序在一个端口上运行(比如6053)并且如果没有在firewall中添加规则,那么函数recvreadrecvfrom就会被阻塞。

我们如何在Cpython 中检查这个并在Linux 机器上报告Port not opened 错误。

【问题讨论】:

  • 你将无法连接socket,超时后你会收到一个异常。
  • 您有兴趣了解某个端口的数据包是否被某些 ip 规则阻止,或者确定该端口是否已绑定到程序并准备好接收数据包?

标签: python c sockets


【解决方案1】:

nmap 等工具可以帮助确定特定端口是打开还是关闭。

TCP: nmap 使用 TCP SYN 扫描或 TCP Connect 扫描等技术,其中服务器将以 ACK-RST 数据包回复 SYN 请求以防关闭端口。您可以注意到,它是在 3 次握手(连接建立)时确定的。

UDP : nmap 还有助于 UDP 扫描,如果 UDP 数据包到达关闭的 UDP 端口,则应返回基于 ICMP 的“端口不可达”数据包(这也取决于操作系统)。与 TCP 不同,UDP 不是基于连接的协议,而且 ICMP 也是无连接的,因此您可能需要在短时间内发送大量 UDP 数据包并根据响应或类似逻辑进行评估。

您可以使用类似的技术/逻辑并确定特定端口是打开还是关闭,并为用户显示适当的消息。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 连接因其他原因而失败,对吗?以及如何使用 Udp
    • 但请确保使用以太网/WLAN 接口的 IP 地址,因为它可能比localhost 施加更严格的规则...
    • 您必须检查错误才能知道连接失败的原因。在 C 语言中,您必须检查 errno(原因可能仍在使用中、权限被拒绝和无人监听(以及其他原因)。
    猜你喜欢
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2013-08-18
    • 2012-06-09
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多