【问题标题】:Read from a raw socket connected to a network interface using golang使用 golang 从连接到网络接口的原始套接字读取
【发布时间】: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


【解决方案1】:

喜欢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(小端)

【讨论】:

  • 非常感谢伙计,改变字节顺序让它工作了!干杯
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 2017-02-16
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多