getaddrinfo返回以前的固定IP地址 上下文:< /强>我的C++应用程序需要知道它运行的计算机是为了执行特定的行为。因此,我的应用程序获取计算机的IP地址,然后使用IP列表在配置文件中检查该地址,以确定计算机的角色。所有计算机都有固定的IP地址。我使用gethostname、getaddrinfo和inet_ntop来实现这一点

getaddrinfo返回以前的固定IP地址 上下文:< /强>我的C++应用程序需要知道它运行的计算机是为了执行特定的行为。因此,我的应用程序获取计算机的IP地址,然后使用IP列表在配置文件中检查该地址,以确定计算机的角色。所有计算机都有固定的IP地址。我使用gethostname、getaddrinfo和inet_ntop来实现这一点,c++,networking,ip-address,getaddrinfo,C++,Networking,Ip Address,Getaddrinfo,问题:在某些目标平台的计算机上,getaddrinfo返回旧的IP地址(设置固定值之前的地址)。但如果我在cmd中执行“ipconfig”,则会显示预期的固定值。它也可以被其他计算机ping。所有计算机只有一个网卡,IPv6已禁用 平台:Windows 7 x64 IDE:Visual Studio 2015 我想知道实际的固定IP地址。 谢谢你的帮助 代码示例: // [Some stuff...] addrinfo hints; addrinfo *pResults; int return

问题:在某些目标平台的计算机上,getaddrinfo返回旧的IP地址(设置固定值之前的地址)。但如果我在cmd中执行“ipconfig”,则会显示预期的固定值。它也可以被其他计算机ping。所有计算机只有一个网卡,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...]

可能名称/地址在本地缓存,并且在超时时间内。。。您可以执行“ipconfig/displaydns”来检查它,或者执行“ipconfig/flushdns”(可能需要提升)来清除缓存可能名称/地址在本地缓存并且在超时时间内。。。您可以执行“ipconfig/displaydns”来检查它,或者执行“ipconfig/flushdns”(可能需要提升)来清除缓存