2011-01-09 27 views
5

我正在制作一个C程序,我需要检查目标计算机上打开的UDP端口。由于UDP是无连接的,我无法像使用TCP一样检查返回值connect()如何判断我是否将UDP数据包发送到开放端口?

send()sendto()返回值也没有帮助。手册页指出:

No indication of failure to deliver is implicit in a send(). Locally 
    detected errors are indicated by a return value of -1. 

如何判断是否将UDP数据包发送到目标主机上的开放端口?

回答

6

一般来说,你不能这样做。

原则上,一个封闭端口的主机应该发回一个ICMP端口 - 无法访问。但他们通常不会;同样,一个关闭或无法访问的主机不会发送这样的消息。另外,一些防火墙会阻止该消息。

检索错误也是有问题的。 Linux具有定义明确的语义,但用于检索套接字上的错误(有关信息,请参阅各种手册页,套接字(7),ip(7)和udp(7))。例如,当您执行不相关的sendto()时,您有时会看到先前报告的错误。其他操作系统对于检索特定套接字错误的机制稍有不同。

如果确保它是另一个端口上的特定协议,则可以发送一个应引发特定响应的数据包(如果它是您自己的协议,则可以添加“你在那里”消息类型),那么你可以使用它。但总的来说,是否产生响应取决于应用程序,并且您无法区分不监听的端口和监听的端口,从而决定不响应您的响应。

+1

不好意思问这个问题,但是如何知道它是否给我发送了ICMP端口 - 无法访问?谢谢。 – Marian 2011-01-09 15:40:09

2

由于UDP是无连接的,因此您必须检查应用程序代码中的端口状态。例如,发送一个数据包到端口,并等待响应。如果您在某些特定应用程序时间内未收到响应,则该端口不可用。

当然,您必须将其设计为发送端和接收端。

+1

哦...所以没有正确的方法来检查然后。谢谢 – Marian 2011-01-09 15:31:07

相关问题