上下文:我的C ++应用程序需要知道它正在运行的计算机才能执行特定的操作。因此,我的应用程序获取计算机的IP地址,然后在具有IP列表的配置文件中检查该地址,以确定计算机的角色。所有计算机都有固定的IP地址。我正在使用gethostname,getaddrinfo和inet_ntop来实现这一目标。
问题:在某些目标平台的计算机上,getaddrinfo返回旧的IP地址(我设置固定值之前的地址)。但是如果我在cmd中执行“ipconfig”,则会显示预期的固定值。它也可以被其他计算机ping。所有计算机只有1个网卡,IPv6被禁用。
平台: Windows 7 x64。
IDE: Visual Studio 2015。
我想拥有实际的固定IP地址。 谢谢你的帮助!
代码示例:
// [Some stuff...]
addrinfo hints;
addrinfo *pResults;
int returnedCode;
char hostName[1024];
if (0 != (returnedCode = gethostname(hostName, sizeof hostName)))
{
// Error handling stuff.
}
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET; // Only want IPv4.
hints.ai_socktype = SOCK_DGRAM; // UDP stream sockets.
hints.ai_flags = AI_PASSIVE; // Fill in my IP for me.
if (0 != (returnedCode = getaddrinfo(hostName, NULL, &hints, &pResults)))
{
// Error handling.
}
struct addrinfo* res;
char buffer[INET_ADDRSTRLEN];
std::string localIP;
for (res = pResults; res != NULL; res = res->ai_next)
{
if (res->ai_family == AF_INET)
{
const char* ip = inet_ntop(AF_INET,
&((struct sockaddr_in *)res->ai_addr)->sin_addr, buffer, INET_ADDRSTRLEN);
if ((NULL == ip) || (nullptr == ip))
{
// Error handling.
}
else
{
localIP = std::string(ip);
}
}
}
freeaddrinfo(pResults); // free the linked-list
WSACleanup();
// [More stuff...]