如何检查UDP端口是否打开? (python)

How to check if UDP port is open? (python)

我正在尝试使用 python 编写端口扫描器,但 UDP 端口存在问题。 Google 说我必须发送一些请求并收到 TimeoutError,这意味着服务器通过端口收到消息并且端口已打开,或者收到 ICMP 消息“Destination unreacheable(Port unreachable)”,意味着端口已关闭。我可以在 Wireshark 中看到 ICMP 消息,但不知道如何让 python 也看到它。

现在我的 UDP 代码如下所示:

def udp_connection(ip, port, timeout):
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        s.settimeout(timeout)
        try:
            s.sendto(b'test', (ip, port))
            data, addr = s.recvfrom(1024)
            return "[+] UDP Port Open: " + str(port) + str(data) + '\n'
        except TimeoutError:
            return "[+] UDP Port Open: " + str(port) + 'kinda no response or something' + '\n'
        except:
            return "[+] UDP Port Closed: " + str(port) + '\n'

这总是 returns TimeoutError。

还尝试了在 Whosebug 上找到的解决方案来添加原始套接字 with socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) as s1: 并使用 data, addr = s1.recvfrom(1024) 而不是 data, addr = s.recvfrom(1024) 接收数据,但没有成功

Python 在尝试接收来自 (ip,closedPort) 的响应时抛出 ConnectionResetError 异常,因为收到 ICMP“目标不可达(端口不可达)”消息,但 ICMP 数据包可能被 windows 阻止防火墙,python 将不会接收它并且...仅此而已。我真的只需要将其关闭才能使我的代码正常工作