繁体   English   中英

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

[英]How can I tell if I sent a UDP packet to an open port?

我正在制作一个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数据包发送到目标主机上的开放端口?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM