【发布时间】:2014-06-09 02:56:14
【问题描述】:
对于 IPAddress 66.249.68.9(“dig -x”正确表示“crawl-66-249-68-9.googlebot.com”),我可爱的程序声称它是 ip68-9-0-0.ri.ri。考克斯网。
我不在乎我是否以类似于下面代码的方式结束,只是希望能够以 IPV4 IP 地址开始并以主机名结束。
额外问题,什么是服务?我想我不需要它,并且会给 getnameinfo NULL。但是,程序正在为 serviceBuffer 输出“17145”。
#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 - 只喜欢大括号初始化。
-
克里斯 - 抱歉,实际问题是为什么我的程序给出 hostBuffer "ip68-9-0-0.ri.ri.cox.net" 而不是正确答案 "crawl-66-249- 68-9.googlebot.com"