主要目標是透過透過連接埠傳送資料並偵聽連接埠無法存取的傳入 ICMP 訊息來偵測開放的 UDP 連接埠。為此,使用以下 Go 函數作為 goroutine 運行:
func listenIcmp(ipAddr string) { conn, err := icmp.ListenPacket("ip4:1", ipAddr) if err != nil { log.Println("Error while listening for ICMP packets: ") log.Println(err) } for { var incoming []byte length, sourceIP, err := conn.ReadFrom(incoming) if err != nil { log.Println(err) continue } log.Printf("message = '%s', length = %d, source-ip = %s", string(incoming), length, sourceIP) } }
這能夠偵測 ICMP ping 和目標不可達,但始終傳回長度為 0 的訊息。範例:
2023/10/11 14:38:32 訊息 = '',長度 = 0,來源 IP = 127.0.0.1
我已經嘗試解析該訊息,但由於它是空的,因此返回運行時錯誤。而且,我給了go執行root權限,但這也不起作用。
編輯:作業系統是 Ubuntu 20.04
#發現自己的錯誤...
我嘗試讀取未初始化的緩衝區。 對傳入緩衝區進行以下變更可以解決該問題:
// var incoming []byte incoming := make([]byte, 80)
以上是僅從 icmp.Packetconn 接收 0 長度的 ICMP 封包的詳細內容。更多資訊請關注PHP中文網其他相關文章!