检测Erlang中UDP的不可访问端口

检测Erlang中UDP的不可访问端口,erlang,udp,icmp,Erlang,Udp,Icmp,我正在寻找一种方法来检测Erlang中传出UDP数据包的“端口不可访问”错误,这样我就可以急切地向应用程序报告传输层错误。也就是说,我想捕获ICMP类型3数据包,以便向更高的层报告数据包尚未到达目的地 目前我知道两种方法: 使用未记录的gen\u udp:connect/3。然而,这似乎需要为每个新的目标对地址打开一个新的套接字:端口。优点是不需要任何特权 使用,它需要setuid帮助程序或功能来打开原始套接字 我还缺少其他变体吗?可能是您想要的,但我自己从未使用过。它是对低级套接字API的绑定

我正在寻找一种方法来检测Erlang中传出UDP数据包的“端口不可访问”错误,这样我就可以急切地向应用程序报告传输层错误。也就是说,我想捕获ICMP类型3数据包,以便向更高的层报告数据包尚未到达目的地

目前我知道两种方法:

  • 使用未记录的
    gen\u udp:connect/3
    。然而,这似乎需要为每个新的目标对地址打开一个新的套接字:端口。优点是不需要任何特权
  • 使用,它需要setuid帮助程序或功能来打开原始套接字

  • 我还缺少其他变体吗?

    可能是您想要的,但我自己从未使用过。它是对低级套接字API的绑定,因此它允许您使用底层API支持的所有协议。我只是引用了它的自述,所以请不要吝啬。

    如果你想测试UDP,为什么你认为ICMP会帮助你?Afaik ICMP只提供对整个机器的更基本的ping,而不是特定的端口。@ZeissS:因为无法访问的端口(以及许多其他情况)是通过ICMP报告的。基本上,当您在没有侦听套接字的情况下向端口发送UDP包时,您(可以或不可以--取决于网络配置、远程主机配置等)接收包含目标地址和端口信息的ICMP类型3、代码3数据包。