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

Mar*_*ian 5 c sockets port udp connect

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

send()sendto()返回值也没有帮助.手册页说明:

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

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

Mar*_*rkR 6

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

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

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

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