使用 golang 从连接到网络接口的原始套接字读取
Read from a raw socket connected to a network interface using golang
我正在尝试使用 golang 读取我的 wifi 卡接收到的 link 层数据包。我编写的程序编译成功并且运行没有任何错误,但它似乎在尝试从套接字读取时卡住了(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
赞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(小端)
我正在尝试使用 golang 读取我的 wifi 卡接收到的 link 层数据包。我编写的程序编译成功并且运行没有任何错误,但它似乎在尝试从套接字读取时卡住了(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
赞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(小端)