Asynchronous 为什么';UDP是否向应用程序返回异步错误?

Asynchronous 为什么';UDP是否向应用程序返回异步错误?,asynchronous,udp,Asynchronous,Udp,在UNPV1中,它表示如果未对UDP套接字调用connect,则此UDP套接字不会向上层应用程序返回异步错误(如“端口未访问”)。其理由见第8.9节: UDP客户端在单个UDP套接字上发送三个UDP数据报 对于不同主机上的三台服务器,该UDP客户端调用recvfrom以等待这三台服务器的回复。假设两台主机运行服务器,而第三台主机不运行服务器。因此,第三台主机将向该UDP客户端返回带有“端口未读”的ICMP错误。如果recvfrom想要返回这个ICMP错误,它必须告诉客户机目标IP/端口,以便客户

在UNPV1中,它表示如果未对UDP套接字调用connect,则此UDP套接字不会向上层应用程序返回异步错误(如“端口未访问”)。其理由见第8.9节:

UDP客户端在单个UDP套接字上发送三个UDP数据报 对于不同主机上的三台服务器,该UDP客户端调用recvfrom以等待这三台服务器的回复。假设两台主机运行服务器,而第三台主机不运行服务器。因此,第三台主机将向该UDP客户端返回带有“端口未读”的ICMP错误。如果recvfrom想要返回这个ICMP错误,它必须告诉客户机目标IP/端口,以便客户机知道哪个数据报引发了错误。但由于recvfrom无法在出现错误时将目标IP/端口返回给客户端,因此recvfrom也无法返回此ICMP错误,相反,recvfrom将阻塞

因此,在阅读本文之后,我可以看出原因是“因为recvfrom不能在出错时将目标IP/端口返回给调用者,因此recvfrom不能返回异步错误(端口未读)。”但为什么recvfrom不能在出错时返回目标IP/端口呢?首先,ICMP消息包含IP报头和UDP报头,因此内核可以知道目标IP/端口对,第二,recvfrom的第五和第六个参数可以用于将此IP/端口对返回给客户端应用程序。这似乎是合理的,对吗?那么,谁能解释一下:

  • 为什么recvfrom在出现错误时无法将目标Ip/端口返回给调用者(如端口未访问)
  • 为什么recvfrom不能返回异步错误(如端口未读)

  • 这不是对您所问问题的回答,但我应该提醒您不要依赖ICMP,除非您控制客户端和服务器之间的整个网络。ICMP通常被公司防火墙阻止,以防止端口探测和其他攻击。