如何获取系统的IP地址。
我想要在执行ipconfig
或/bin/ifconfig
答案 0 :(得分:4)
您的意思是“IP地址” - 在Win32中使用GetAdapterAddresses。那里有示例代码。
这有点令人费解,因为您首先调用API必须查看您需要多少内存,然后使用所需的内存块再次调用相同的API。然后,您必须遍历该内存块中返回的结构列表,如示例所示。你最终会得到的是:
使用SOCKET_ADDRESS结构 在IP_ADAPTER_ADDRESSES结构中 AdapterAddresses指出 参数。在Microsoft Windows上 软件开发套件(SDK) 发布于Windows Vista及更高版本, 头文件的组织有 改变了和SOCKET_ADDRESS 结构在Ws2def.h中定义 头文件是自动的 包含在Winsock2.h头文件中 文件。在发布的Platform SDK上 Windows Server 2003和Windows XP, SOCKET_ADDRESS结构是 在Winsock2.h头文件中声明 文件。为了使用 IP_ADAPTER_ADDRESSES结构, Winsock2.h头文件必须是 包含在Iphlpapi.h标题之前 文件。
此时,您可以调用WSAAddressToString来串联SOCKET_ADDRESS
结构中的IP地址,无论是IPv6还是IPv4。
答案 1 :(得分:0)
你的问题不是很具体,但这应该会有所帮助:
答案 2 :(得分:0)
如果您位于防火墙后面且想知道您的公共IP地址,您可以使用HTTP客户端库来抓取this one之类的网页(有一个只返回IP地址为text / plain,但我现在找不到它。)
答案 3 :(得分:0)
如果可以访问.NET Framework(托管C ++),则可以使用System.Net.Dns.GetHostAddress方法。有关详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/system.net.dns.gethostaddresses.aspx 实际上,您获得了一个IP数组,因为一个域名可以对应多个IP。
答案 4 :(得分:0)
对于本地IP地址,您可以使用winsock。看看this example。
如果您使用winsock,请确保在项目中添加适当的库。例如,我要在VS 2008中添加Ws2_32.lib
。
答案 5 :(得分:0)
// 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;
}