微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c ++ Windows 10为连接的客户端获取IP

如何解决c ++ Windows 10为连接的客户端获取IP

我已经建立了一个工作正常的WinSock2套接字,并且该客户机可以连接,如何获得已连接客户机的IP地址。

解决方法

第一次接受客户端时,accept()报告客户端的IP地址。也可以随时使用getpeername()从客户端SOCKET进行查询。这两个函数都根据您使用sockaddr_...创建服务器套接字时分配的地址类型,填充了必须分配并传递的socket()结构:

  • 如果为AF_INET,请提供一个sockaddr_in结构:
sockaddr_in clientAddr;
int clientAddrSize = sizeof(clientAddr);
SOCKET client = accept(server,(sockaddr*)&client_addr,&clientAddrSize);
if (client != INVALID_SOCKET)
{
    // use client_addr.sin_addr as needed...
    ...
    clientAddrSize = sizeof(clientAddr);
    if (getpeername(client,&clientAddrSize) == 0)
    {
        // use client_addr.sin_addr as needed...
    }
    ...
    closesocket(client);
}
  • 如果启用了AF_INET6的{​​{1}},请提供IPV6_V6ONLY结构:
sockaddr_in6
  • 如果禁用了sockaddr_in6 clientAddr; int clientAddrSize = sizeof(clientAddr); SOCKET client = accept(server,&clientAddrSize); if (client != INVALID_SOCKET) { // use client_addr.sin6_addr as needed... ... clientAddrSize = sizeof(clientAddr); if (getpeername(client,&clientAddrSize) == 0) { // use client_addr.sin6_addr as needed... } ... closesocket(client); } 的{​​{1}},请提供一个AF_INET6结构,然后查看其IPV6_V6ONLY字段以了解是否将sockaddr_storage数据强制转换为ss_familysockaddr_storage
sockaddr_in

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。