由于我之前的问题没有得到答案,我将重新措辞。
使用 PC 名称(NetBIOS 名称)执行 gethostbyname() 时,使用什么 IP 地址顺序(如果 IP 地址绑定到一个接口)?
我有这个代码:
#include <iostream>
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")
int main()
{
char hostname[255];
struct hostent *he;
struct in_addr **addr_list;
WSAData data;
WSAStartup(MAKEWORD(2, 2), &data);
gethostname(hostname, 255);
std::cout << "Host name: " << hostname << std::endl;
if ((he = gethostbyname(hostname)) == NULL) {
std::cout << "gethostbyname error" << std::endl;
} else {
std::cout << "IP addresses: " << std::endl;
addr_list = (struct in_addr **)he->h_addr_list;
for(int i = 0; addr_list[i] != NULL; i++) {
std::cout << inet_ntoa(*addr_list[i]) << std::endl;
}
}
std::cin.get();
}
它在 Windows Server 2012 和 Windows Server 2008 / Windows 7 上给了我不同的结果。在我的装有 Windows 7 的家用 PC 上,使用升序:
Host name: SplattWin
IP addresses:
192.168.1.140
192.168.3.1
192.168.3.2
192.168.3.3
192.168.3.4
但是,在 Windows server 2012 上,它按降序为我提供 IP 地址:
Host name: WinServ
IP addresses:
1.1.1.4
1.1.1.3
1.1.1.2
1.1.1.1
有没有办法重新排序?我在添加这些 IP 地址时尝试了 skipassource 标志,但在这种情况下它似乎不起作用。
我有第三方软件使用 gethostname() 后跟 gethostbyname() 来确定它自己的 IP 地址(它首先从列表中获取)。每次向系统添加新 IP 地址时都需要更改设置和客户端,这真的很令人沮丧。