我正在研究一个具有客户端 - 服务器架构的模块.我必须根据MAC地址验证连接的对等机器.
在安装时,我存储有效MAC地址的加密列表.
请注意,我无法控制此对等计算机,并且某些第三方应用程序将在此运行,我无法在此对等计算机上安装任何应用程序.
在发生套接字连接的运行时,我需要知道连接中使用的IP地址的MAC地址,以便我可以根据先前存储的MAC地址对其进行验证.
是否有可用的C/C++ API可以帮助我从IP地址获取MAC地址.这台机器通常连接在局域网中,但它可以在不同的子网上.
我的模块是多平台的,可以在Windows,Solaris和Linux上运行,类似地,对等机可以在任何操作系统上运行.
不幸的是,简单的答案实际上是"不要那样做".
如果您的对等计算机位于不同的子网上(因此您和对等方之间的流量通过路由器),则无法执行您想要的操作 - 您收到的数据包的MAC地址将是MAC地址将它们转发给您的路由器,因为它是您正在与之通信的链路层设备.只有离对等机最近的路由器才能知道对等体的MAC地址是什么 - 并且该信息不会被传递.
如果对等计算机位于同一子网上,则传入的数据包将包含以太网报头中对等方的MAC地址...但在将数据包传递到您的应用程序之前,这将被剥离.您的选项几乎限于您正在侦听以获取整个数据包的网络接口上的数据包捕获,或者使用系统提供的任何工具来检查本地ARP表.这两个选项都非常依赖于平台!
此外,如果您正在处理的接口不是以太网接口(也许它们是PPP链接,或者WiFi,或某种类型的时髦虚拟化接口......),那么这两个选项都不可能继续工作而不进行修改.他们将与IPv6合作吗?
如果毕竟还没有确定,请查看libpcap/WinPCap进行数据包捕获,这是最容易想到的便携式选项.要检查本地ARP表,Linux,OS X,Solaris和Windows都提供arp命令行实用程序,但语法可能会有所不同.如果API可用,我不希望平台之间有任何共性 - 这种事情没有标准,因为你真的不应该这样做!
| 归档时间: |
|
| 查看次数: |
12812 次 |
| 最近记录: |