问题描述
我已经建立了一个工作正常的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_family
或sockaddr_storage
:
sockaddr_in