getaddrinfo返回先前的固定IP地址

时间:2017-02-09 13:38:52

标签: c++ networking ip-address getaddrinfo

上下文:我的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...]

0 个答案:

没有答案