Как я могу получить MAC-адрес из сокета, возвращенного из gen_tcp: accept / 1? - PullRequest
0 голосов
/ 10 сентября 2018

Пока у меня есть следующий код эликсира

{:ok, server_socket} = :gen_tcp.listen(port)
{:ok, client_socket} = :gen_tcp.accept(server_socket)

Как я могу получить MAC-адрес от client_socket?

P.S. Я знаю, что MAC-адрес меняется при каждом переходе, но моя сеть гарантирует, что от клиента до сервера остается только один переход, поэтому, если я могу получить MAC-адрес, это определенно клиент.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете использовать os: cmd в сочетании с ip соседом show

os:cmd("ip neighbor show").
0 голосов
/ 10 сентября 2018

Erlang предоставляет :inet.getifaddrs/0 для получения списка имен интерфейсов и их адресов, но не существует готового метода, который позволил бы вам получить MAC-адрес подключенного хоста. или роутер, из розетки.

Проблема в том, что TCP не зависит от каких-либо протоколов уровня MAC. На практике при использовании канального уровня Ethernet стек TCP использует ARP для получения MAC-адреса подключенного хоста или маршрутизатора.

Несколько возможных решений:

  • Использование результата ioctl SIOCGARP с помощью некоторого C кода
  • Использование System.cmd для получения результата программы оболочки, такой как arp
...