如何判断是否将UDP数据包发送到开放端口?

时间:2011-01-09 15:22:16

标签: c sockets udp port connect

我正在制作一个C程序,我需要检查目标计算机上打开的UDP端口。因为UDP是无连接的,所以我不能像TCP一样检查connect()的返回值。

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数据包发送到目标主机上的开放端口?

2 个答案:

答案 0 :(得分:6)

一般情况下你不能这样做。

原则上,具有关闭端口的主机应该发送回ICMP端口不可达。但他们经常不这样做;同样,失败或无法访问的主机不会发送此类消息。此外,一些防火墙将阻止该消息。

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

如果确保它是另一个端口上的特定协议,您可以发送一个应该引出特定响应的数据包(如果它是您自己的协议,您可以添加“你在那里”的消息类型),然后你可以用它。但一般来说,是否生成响应取决于应用程序,并且您无法区分没有任何侦听的端口,以及具有某些侦听决定不响应您的端口。

答案 1 :(得分:2)

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

当然,你必须将它设计到发送端和接收端。