ZBLOG

SOCKADDR_IN clientAddress{}; int clientAddressLength = sizeof(clientAddress); SOCKET clientSocket = accept(listenSocket, (SOCKADDR*)&clientAddress, &clientAddressLength); if (clientSocket == INVALID_SOCKET) { q...

在你提供的代码片段中,accept() 函数用于接受来自客户端的连接,并返回一个与该客户端通信的新套接字(clientSocket)。然而,通过 SOCKADDR_IN 结构体仅能获取到客户端的IP地址,而不能直接获得MAC地址。

为什么无法通过Socket获取MAC地址?

  1. 网络层级:TCP/IP协议栈中的MAC地址位于数据链路层,而IP地址则位于网络层。accept() 函数只会提供TCP/IP层的信息,因此只能获得对方的IP地址。

  2. ARP协议:虽然可以使用ARP(Address Resolution Protocol)请求来查找某个IP对应的MAC地址,但这通常不适用于已经建立的TCP连接,因为MAC地址是局域网内的信息,不会在跨越不同网络时被传递。

如何间接获取客户端的MAC地址?

如果你需要获取客户端的MAC地址,以下是一种常见的方法:

  • 服务器端和客户端配合
    • 在应用层协议中,要求客户端在连接时主动发送其MAC地址,例如通过一个特定的数据包。
    • 服务器接收到这个数据后,可以将其记录下来。

示例实现

如果你控制着客户端应用程序,你可以在客户端发送它的MAC地址作为连接的一部分。下面是伪代码描述如何实现:

  1. 在客户端

    // 客户端代码
    QString macAddress = ...; // 获取本机 MAC 地址
    send(socket, macAddress.toStdString().c_str(), macAddress.length(), 0);
    
  2. 在服务器端

    char buffer[256];
    int result = recv(clientSocket, buffer, sizeof(buffer), 0);
    if (result > 0) {
       QString clientMacAddress = QString::fromStdString(std::string(buffer, result));
       insertTohash(clientSocket, clientMacAddress); // 存储 MAC 地址
    }
    

总结来说,你不能直接从套接字中获得客户机的MAC地址,需要通过其他方式进行传输或存储。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6461

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?