Чтение из необработанного сокета, подключенного к сетевому интерфейсу с использованием golang - PullRequest
4 голосов
/ 08 апреля 2020

Я пытаюсь прочитать пакеты канального уровня, полученные моей Wi-Fi-картой, используя golang. Написанная мною программа успешно компилируется и работает без ошибок, но, похоже, она застряла при попытке чтения из сокета (syscall.Recvfrom(fd, data, 0 - на данный момент, чтобы быть точным). Что я делаю не так?

PS: wlx34e894f77905 - это имя моего устройства Wi-Fi.

Моя функция, которая пытается прочитать пакеты:

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

1 Ответ

4 голосов
/ 15 апреля 2020

как 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 (младший порядок)

...