2011-09-25 139 views
4

我正在尋找一種方法來檢測Erlang中的傳出UDP數據包的「端口不可達」錯誤,以便我可以將傳輸層錯誤熱切地報告給應用程序。即,我想要捕獲ICMP類型3數據包,以向高層報告數據包尚未到達目的地。在Erlang中檢測UDP的不可達端口

目前我所知道的兩種方法:

  1. 使用無證gen_udp:connect/3。但是,似乎需要爲每個新的目的地址地址打開一個新的套接字:端口。優點是這不需要任何特權。
  2. 使用gen_icmp需要setuid助手或能力來打開原始套接字。

是否還有其他變種我缺少?

+0

如果你想測試UDP,你爲什麼認爲ICMP會幫助你? Afaik ICMP僅提供整個機器的更基本的ping,而不是特定的端口。 – ZeissS

+2

@ZeissS:因爲無法訪問的端口(以及許多其他條件)通過ICMP報告。 –

+2

基本上,當你將UDP數據包發送到沒有監聽套接字的端口時,你(可能或不可能 - 取決於網絡配置,遠程主機配置等)接收ICMP類型3,代碼3數據包,其中包含有關目標地址和端口的信息。 –

回答

1

procket可能是你在找什麼,但我從來沒有用過它。它是對低級套接字API的綁定,因此它允許您使用底層API支持的所有協議。我只是引用它的自述文件,所以請帶上一小撮鹽。