我正在寻找一种方法来检测 Erlang 中传出 UDP 数据包的“端口不可达”错误,因此我可以急切地向应用程序报告传输层错误。即,我想捕获 ICMP 类型 3 数据包以向更高层报告该数据包尚未到达目的地。
目前我知道两种方法:
- 使用未记录
gen_udp:connect/3
的 . 但是,这似乎需要为每个新的目标对地址打开一个新套接字:端口。优点是这不需要任何特权。 - 使用gen_icmp,它需要 setuid 帮助程序或打开原始套接字的能力。
我还缺少其他变体吗?
procket可能是您正在寻找的东西,但我自己从未使用过它。它是对低级套接字 API 的绑定,因此它允许您使用底层 API 支持的所有协议。我只是引用它的自述文件,所以请用少许盐来接受它。