对于IP地址66.249.68.9(“dig-x”正确显示为“crawl-66-249-68-9.googlebot.com”),我的程序却声称它是ip68-9-0-0.ri.ri.cox.net。
我不在乎最终的实现方式是否类似下面的代码,只想能够从IPv4地址开始并以主机名结束。
额外的问题是,什么是服务?我认为我不需要它,并将使getnameinfo为空。但是,该程序正在输出“17145”作为serviceBuffer。
我不在乎最终的实现方式是否类似下面的代码,只想能够从IPv4地址开始并以主机名结束。
额外的问题是,什么是服务?我认为我不需要它,并将使getnameinfo为空。但是,该程序正在输出“17145”作为serviceBuffer。
#include <string>
#include <iostream>
using namespace std;
#include <netdb.h> // struct sockaddr, AF_INET, NI_NAMEREQD, getnameinfo
#include <string.h> // memset
#include <arpa/inet.h> // inet_pton
int main() {
const string IPAddress { "66.249.68.9" };
struct sockaddr structSockAddr;
memset(&structSockAddr, 0, sizeof(structSockAddr));
structSockAddr.sa_family = AF_INET;
int inetPtonReturnValue { inet_pton(AF_INET, IPAddress.c_str(), &structSockAddr.sa_data) };
if(1 != inetPtonReturnValue) {
cout << "inetPtonReturnValue : " << inetPtonReturnValue << endl; // 0 = src doesn't contain valid address, -1 = af isn't a valid family
}
char hostBuffer[10000];
char serviceBuffer[1000];
int getNameInfoReturnValue { getnameinfo(&structSockAddr, sizeof(structSockAddr), hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NAMEREQD) };
if(0 != getNameInfoReturnValue) {
cout << "getNameInfoReturnValue : " << getNameInfoReturnValue << endl
<< "gai_strerror() : " << gai_strerror(getNameInfoReturnValue) << endl;
} else {
cout << "IPAddress : " << IPAddress << endl
<< "hostBuffer : " << hostBuffer << endl
<< "serviceBuffer : " << serviceBuffer << endl;
}
}
int inetPtonReturnValue { inet_pton(AF_INET, IPAddress.c_str(), &structSockAddr.sa_data) };
有什么原因,而不是直接将inet_pton
赋值给inetPtonReturnValue
? - Joe