6

假设我有一个简单的 winsock 服务器,它有一个监听套接字,然后当一个连接被接受时,它将套接字存储在一个套接字数组中(以允许多个连接)。如何获取特定连接的 IP 地址?它是否存储在套接字句柄中?

4

2 回答 2

8

只要套接字保持连接,您就可以获得自己的套接字地址和对等地址。

getsockname将为您提供本地名称(即来自管道的一侧) getpeername将为您提供对等名称(即管道的远端)

此信息仅在套接字打开/连接时可用,因此如果在对等断开后可以使用它,最好将其存储在某个地方。

于 2013-03-13T10:21:03.783 回答
6

是的,它存储在socketaddr_in结构中,您可以使用以下方法提取它:

SOCKADDR_IN client_info = {0};
int addrsize = sizeof(client_info);

// get it during the accept call
SOCKET client_sock = accept(serv, (struct sockaddr*)&client_info, &addrsize);

// or get it from the socket itself at any time
getpeername(client_sock, &client_info, sizeof(client_info));

char *ip = inet_ntoa(client_info.sin_addr);

printf("%s", ip);
于 2013-03-13T10:16:20.333 回答