[英]Displaying IPv6 addresses
我正在编写一个程序来显示机器的本地IP地址。 我能够显示IPv4地址,而无法显示IPv6地址。 下面是我用来显示IPv4地址的程序:
#include <iostream.h>
#include <winsock.h>
int doit(int, char **)
{
char ac[80];
if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
cerr << "Error " << WSAGetLastError() <<
" when getting local host name." << endl;
return 1;
}
cout << "Host name is " << ac << "." << endl;
struct hostent *phe = gethostbyname(ac);
if (phe == 0) {
cerr << "Yow! Bad host lookup." << endl;
return 1;
}
for (int i = 0; phe->h_addr_list[i] != 0; ++i) {
struct in_addr addr;
memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
cout << "Address " << i << ": " << inet_ntoa(addr) << endl;
}
return 0;
}
int main(int argc, char *argv[])
{
WSAData wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
return 255;
}
int retval = doit(argc, argv);
WSACleanup();
return retval;
}
gethostbyname
已过时,并且在许多系统上都忽略IPv6条目。
使用现代的getaddrinfo
函数并检查ai_family
成员的AI_INET
或AI_INET6
以识别地址类型。
如先前的答案所述,请使用getaddrinfo()。 另外,由于您使用的是C ++,因此请确保使用RAII进行清理,因此即使抛出异常也将进行清理。 这是一个例子:
if ( (n = getaddrinfo(host.c_str(), service.c_str(), &hints, &res)) != 0) {
ostringstream ss;
ss << "getaddrinfo error for " << host << ", " << service
<< ", " << gai_strerror(n);
throw std::runtime_error(ss.str());
}
// Make sure freeaddrinfo is called even if exceptions are thrown.
// Note that we do not need to check res for NULL, unique_ptr handles that
// when deallocating.
auto cleanup = [](addrinfo* ai) { freeaddrinfo(ai); };
unique_ptr<addrinfo, decltype(cleanup)> aip(res, cleanup);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.