【发布时间】:2020-04-07 22:15:09
【问题描述】:
我正在尝试使用 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
【问题讨论】:
-
在您执行此操作时,您的无线设备是否已配置并且您的 Internet 流量是否通过它?请提供“netstat -r”输出。
-
@Jomu 是的,互联网流量正在通过我的 wifi 卡进行路由。使用 netstat 输出编辑原始问题。
-
多年前,我用 TAP 设备做过类似的工作。你这样做的方式,IIRC,与这个设备的内核斗争,你在那里输了。这里重要的是你想要实现什么?您想嗅探流量还是参与其中?如果你想嗅探流量,那么你可以看看 libpcap 是如何做到的,如果你想参与,那么 TUN/TAP。
-
似乎罪魁祸首是字节序。 @Jomu
标签: sockets go networking raw-sockets