假设我有一个简单的winsock服务器,它有一个监听套接字,当连接被接受时,把套接字存储在套接字数组中(以允许多个连接)。
如何获取特定连接的IP地址?它是否存储在套接字句柄中?
是的,它被存储在 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);
SOCKADDR_IN
真的存在吗? 1 应该是 sockaddr_in
而不是 socketaddr_in
。 2 您忘记传递 client_info
的地址(两次); 3 client
没有被声明。 4 accept()
需要一个第三个参数!至少4个不准确 -> -1 - alkclient.sin_addr
应该改为 client_info.sin_addr
。 - alkaccept(serv, &client_info, &addrsize);
会产生两个类型不匹配的警告。第一个是指针类型不匹配,第二个是整数类型不匹配。通常可以通过以下方式解决:socklen_t addrsize = 0; accept(serv, (struct sockaddr *) &client_info, &addrsize);
更新: 如果使用WINSOCK2 API,则后者在Windows上不是问题,因为这里使用了 int*
。 - alk