检查UDP上的远程端口是否为UP(侦听)?

时间:2013-04-25 14:10:36

标签: c# .net udp

我将根据运行的服务(IP +端口)来检测远程主机是否已启动。我不能使用ping,因为我们需要使其工作,即使ICMP端口被阻止。

有时服务使用TCP,有时是UDP(但是当我要检查时,我知道服务器是否必须在UDP或TCP上运行,这取决于它的类型)。我没有检查TCP端口的问题(基于https://stackoverflow.com/a/7605428/397830)。但由于UDP不是面向连接的协议,我怎么能确定远程主机在这个端口上监听UDP?

谢谢!

3 个答案:

答案 0 :(得分:1)

摘自nmap文档:

UDP扫描通过向每个目标端口发送UDP数据包来工作。对于某些常见端口(如53和161),将发送特定于协议的有效负载,但对于大多数端口,数据包为空。 --data-length选项可用于向每个端口发送固定长度的随机有效负载,或者(如果指定值0)以禁用有效负载。如果返回ICMP端口不可达错误(类型3,代码3),则关闭端口。其他ICMP不可达错误(类型3,代码1,2,9,10或13)将端口标记为已过滤。有时,服务将使用UDP数据包进行响应,证明它已打开。如果重传后没有收到响应,则端口被分类为open | filtered。这意味着端口可能是打开的,或者数据包筛选器阻止通信。版本检测(-sV)可用于帮助区分真正开放的端口和过滤的端口。

您可以在此阅读完整文章: NMAP port scanning

答案 1 :(得分:0)

对于UDP,您可以将“hello数据包”集成到您的协议中,一旦在Serverside上收到该数据包,服务器就会发回另一个“hello数据包”,一旦客户端收到该数据包,就会知道该服务器已启用并且运行

答案 2 :(得分:0)

UDP主要是火灾而忘记。如果你没有得到端口无法访问的响应,那么端口可以打开...试试这个python脚本:

import socket

IP = "172.16.0.1"
PORT = 1900
MESSAGE = "Hello"

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(MESSAGE, (IP, PORT))

执行此操作时,以root身份运行$(tcpdump icmp和host 172.17.0.1) 如果端口关闭,你应该看到这样的东西 IP 172.16.0.1> xxx.local:ICMP 172.16.0.1 udp端口1900无法访问,长度为49 没有这个表明端口可能是打开的