gpt4 book ai didi

c++ - gethostbyname 函数中的 IP 地址顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:59 25 4
gpt4 key购买 nike

由于我之前的问题没有得到答案,我将重新措辞。

在使用 PC 名称(NetBIOS 名称)执行 gethostbyname() 时,IP 地址的顺序是什么(如果 IP 地址绑定(bind)到一个接口(interface))?

我有这个代码:

#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 的家用电脑上,使用升序:

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 地址时,您都需要更改设置和客户端,这真的很令人沮丧。

最佳答案

IP 的顺序由 Windows 根据接口(interface)优先级等决定。没有跨越机器边界或 Windows 版本边界的标准规则。您必须将输出列表视为随机的,并根据您的特定需要自行重新排序 IP。例如:

#include <iostream>
#include <vector>
#include <algorithm>
#include <winsock.h>

#pragma comment(lib, "Ws2_32.lib")

bool SortInAddr(const in_addr &a, const in_addr &b)
{
return (a.S_un.S_addr < b.S_un.S_addr);
}

int main()
{
WSAData data;
WSAStartup(MAKEWORD(2, 2), &data);

char hostname[256] = {0};
if (gethostname(hostname, 255) == SOCKET_ERROR)
{
std::cout << "gethostname error: " << WSAGetLastError() << std::endl;
}
else
{
std::cout << "Host name: " << hostname << std::endl;

struct hostent *he = gethostbyname(hostname);
if (he == NULL)
{
std::cout << "gethostbyname error: " << WSAGetLastError() << std::endl;
}
else if (he->h_length != sizeof(in_addr))
{
std::cout << "gethostbyname did not return IPv4 addresses" << std::endl;
}
else
{
std::vector<in_addr> addrs;

struct in_addr **addr_list = (struct in_addr **)(he->h_addr_list);
for(int i = 0; addr_list[i] != NULL; ++i)
{
addrs.push_back(*(addr_list[i]));
}

if (addrs.size() > 1)
{
std::sort(addrs.begin(), addrs.end(), SortInAddr);
}

std::cout << "IPv4 addresses: " << std::endl;
for(std::vector<in_addr>::iterator iter = addrs.begin();
iter != addrs.end();
++iter)
{
std::cout << inet_ntoa(addrs[i]) << std::endl;
}
}
}

WSACleanup();
std::cin.get();
}

也就是说,不要使用gethostbyname()(或getaddrinfo())来枚举机器的本地接口(interface)。此类功能不用于此目的。请改用 GetAdaptersInfo()GetAdaptersAddresses()。它们专门用于枚举本地接口(interface),并为您提供有关接口(interface)的更多详细信息。

关于c++ - gethostbyname 函数中的 IP 地址顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26888853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com