![](/img/trans.png)
[英]if I am listening on 2 ports with one Listening Socket how can I tell which port received the packet?
[英]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.