如何获取系统的IP地址
后看到你的意思是“IP地址” - 在Win32中使用GetAdapterAddresses。那里有示例代码。
这有点令人费解,因为您首先调用API必须查看您需要多少内存,然后再次调用具有所需内存块的相同API。然后,您必须按照示例所示遍历该内存块中返回的结构列表。什么你最终锣去是这样的:
的SOCKET_ADDRESS结构在IP_ADAPTER_ADDRESSES结构 由AdapterAddresses 参数指向使用 。在Microsoft Windows 软件开发工具包(SDK) 发布的Windows Vista和更高版本, 的头文件组织 改变,SOCKET_ADDRESS 结构在Ws2def.h 头文件自动为 由包括定义Winsock2.h标头 文件。在平台SDK发布的 Windows Server 2003和Windows XP, SOCKET_ADDRESS结构是 在Winsock2.h标头 文件中声明。为了使用 IP_ADAPTER_ADDRESSES结构, Winsock2.h头文件必须包含在Iphlpapi.h头文件 之前的 。
在这一点上,你可以打电话给WSAAddressToString字符串IZE多数民众赞成召开SOCKET_ADDRESS
结构内部的IP地址,不管是IPv6或IPv4。
如果您在防火墙后面,想知道你的公网IP地址,你可以使用一个HTTP客户端库刮像this one这样的网页(有一个只是以文本/纯文本的形式返回IP地址,但我现在找不到它)。
在C++中? (15个字符) – 2010-10-22 13:55:01
谢谢@The ...不正确阅读标签是我的一个坏习惯。 – 2010-10-22 13:56:00
[我知道你的意思](http://stackoverflow.com/questions/3962395/really-simple-programming-languages/3963880#3963880“不读thouroghly”):) – Default 2010-10-22 14:00:07
如果您可以访问.NET Framework(托管C++),则可以使用System.Net.Dns.GetHostAddress方法。请参阅此处了解更多信息:http://msdn.microsoft.com/en-us/library/system.net.dns.gethostaddresses.aspx 实际上,您可以获得一组IP地址,因为一个域名可以对应多个IP。
// Requires that WSAStartup has been called
std::vector<std::string> GetIPAddresses(const std::string& hostname)
{
std::vector<std::string> result;
// We use getaddrinfo (gethostbyname has been deprecated)
struct addrinfo hints = {0};
hints.ai_family = AF_UNSPEC; // Want both IPv4 and IPv6
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
struct addrinfo *paddrinfo = NULL;
if (getaddrinfo(hostname.c_str(), NULL, &hints, &paddrinfo)!=0)
return result; // Something is wrong, empty list returned
// The machine can have multiple IP addresses (IPv4, IPv6, etc.)
for(struct addrinfo *ptr=paddrinfo; ptr != NULL ;ptr=ptr->ai_next)
{
// inet_ntop is not available for all versions of Windows, we implement our own
char ipaddress[NI_MAXHOST] = {0};
if (ptr->ai_family == AF_INET)
{
if (getnameinfo(ptr->ai_addr, sizeof(struct sockaddr_in), ipaddress, _countof(ipaddress)-1, NULL, 0, NI_NUMERICHOST)==0)
result.push_back(std::string(ipaddress));
}
else if (ptr->ai_family == AF_INET6)
{
if (getnameinfo(ptr->ai_addr, sizeof(struct sockaddr_in6), ipaddress, _countof(ipaddress)-1, NULL, 0, NI_NUMERICHOST)==0)
result.push_back(std::string(ipaddress));
}
}
freeaddrinfo(paddrinfo);
return result;
}
什么IP地址 - 内部网络或计算机通过互联网连接的?如果内置多个网卡会怎么样? – 2010-10-22 13:53:54
更重要的是,IPv4还是IPv6? – MSalters 2010-10-22 14:03:37
很多时候,当有人说“我想**系统的** IP地址”时,他的整个设计都是错误的。您**必须**假设系统可以有0到N个IP地址。其他一切都是错误的。 – ereOn 2010-10-22 14:59:50