从使用golang连接到网络接口的原始套接字读取

问题描述 投票:1回答:1

我正在尝试使用golang读取我的wifi卡接收的链路层数据包。我编写的程序可以成功编译并运行,没有任何错误,但是在尝试从套接字读取时似乎卡住了(syscall.Recvfrom(fd, data, 0-确切地说,这是正确的)。我在做什么错?

PS:wlx34e894f77905是我的wifi设备的名称。

我尝试读取数据包的功能:

func readFromSocket() {
    fd, error := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, syscall.ETH_P_ALL)
    if error != nil {
        syscall.Close(fd)
        panic(error)
    }
    err := syscall.BindToDevice(fd, "wlx34e894f77905")
    if err != nil {
        syscall.Close(fd)
        panic(err)
    }
    data := make([]byte, 1024)
    for {
        syscall.Recvfrom(fd, data, 0)
        fmt.Println(data)
    }
}

[netstat -r输出:

default         _gateway        0.0.0.0         UG        0 0          0 wlx34e894f77905
link-local      0.0.0.0         255.255.0.0     U         0 0          0 wlx34e894f77905
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br-3d5c8c113e89
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 wlx34e894f77905
sockets go networking raw-sockets
1个回答
0
投票

像c / c ++代码:

sock_raw=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));

所以,golang是:

syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, htons(syscall.ETH_P_ALL))

htons(syscall.ETH_P_ALL)=> 0x0300(小尾数)

© www.soinside.com 2019 - 2024. All rights reserved.