首頁  >  文章  >  後端開發  >  僅從 icmp.Packetconn 接收 0 長度的 ICMP 封包

僅從 icmp.Packetconn 接收 0 長度的 ICMP 封包

WBOY
WBOY轉載
2024-02-05 21:24:041174瀏覽

仅从 icmp.Packetconn 接收 0 长度的 ICMP 数据包

問題內容

主要目標是透過透過連接埠傳送資料並偵聽連接埠無法存取的傳入 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除