如何从localhost检查连接的真实IP地址?基本上我使用以下函数来获取给定远程连接的地址。
std::string getpeerhost(int _fd) const {
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
//int port = -1;
len = sizeof(addr);
if(::getpeername(_fd, (struct sockaddr*)&addr, &len) == -1) {
return {""};
}
// IP4
if (addr.ss_family == AF_INET) {
auto s = (struct sockaddr_in *)&addr;
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof(ipstr));
}
// IP6
else {
auto s = (struct sockaddr_in6 *)&addr;
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof(ipstr));
}
return std::string(ipstr);
}
当给定套接字文件描述符getpeername
来自与服务器相同的主机时,问题是127.0.0.1
可能返回_fd
。在我的应用程序中,服务器必须在其他客户端之间传递客户端的地址,当然传递127.0.0.1
没有任何意义。