如何从 gen_tcp:accept/1 返回的套接字中获取 MAC 地址?

How can I get the MAC address from a socket returned from gen_tcp:accept/1?

到目前为止,我有以下 Elixir 代码

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

如何从 client_socket 获取 MAC 地址?

P.S。我知道 MAC 地址每一跳都会更改,但我的网络确保从客户端到服务器只有一跳,所以如果我可以获得 MAC 地址,那肯定是客户端的。

Erlang 提供 :inet.getifaddrs/0 来获取接口名称及其地址的列表,但是没有开箱即用的方法可以让您获取接口的 mac 地址从套接字连接的主机或路由器。

问题在于 TCP 独立于任何 MAC 级协议。实际上,当使用以太网 link 层时,TCP 堆栈使用 ARP 来获取连接的主机或路由器的 MAC。

一些可能的解决方案是:

  • 通过一些 C 代码连接到 ioctl SIOCGARP 的结果
  • 使用 System.cmd 获得 shell 程序的结果,例如 arp

您可以将 os:cmd 与 ip neighbor show

结合使用
os:cmd("ip neighbor show").