我正在使用 mdlayhers (golang) 庫來處理原始以太網幀以接收和處理網路設備上的 LLDP 資料包。我想監視 LLDP 幀的大量介面(最多 128 個)。
在 Linux 中,我認為不需要指定介面來捕獲設備資料,但我可能是錯的。是否可以通過例如系結到所有介面接收原始以太網幀AF_PACKET?即有沒有辦法指定一個通配符介面raw.ListenPacket或者我最好為每個介面創建一個新的goroutine?
uj5u.com熱心網友回復:
是的你可以。我相信這就是您正在尋找的:
package main
import (
"fmt"
"net"
"os"
"syscall"
)
func main() {
fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, int(htons(syscall.ETH_P_ALL)))
if err != nil {
fmt.Fprintf(os.Stderr, "syscall socket: %s", err.Error())
os.Exit(1)
}
// Make a 32KB buffer
buf := make([]byte, 1<<16)
for {
len, sockaddr, err := syscall.Recvfrom(fd, buf, 0)
if err != nil {
fmt.Fprintf(os.Stderr, "syscall recvfrom: %s", err.Error())
os.Exit(1)
}
if llsa, ok := sockaddr.(*syscall.SockaddrLinklayer); ok {
inter, err := net.InterfaceByIndex(llsa.Ifindex)
if err != nil {
fmt.Fprintf(os.Stderr, "interface from ifindex: %s", err.Error())
os.Exit(1)
}
fmt.Print(inter.Name ": ")
}
fmt.Printf("% X\n", buf[:len])
}
}
// htons converts a short (uint16) from host-to-network byte order.
func htons(i uint16) uint16 {
return (i<<8)&0xff00 | i>>8
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409649.html
標籤:
上一篇:無效字符的位元組到字串轉換
