如何从 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").
到目前为止,我有以下 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").