对于 IPAddress 66.249.68.9(“dig -x”正确地说“crawl-66-249-68-9.googlebot.com”),我可爱的程序声称它是 ip68-9-0-0.ri.ri.cox.net 。
我不在乎我最终是否会采用类似于下面代码的方式,只是希望能够以 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;
}
}
您正在使用一个struct sockaddr
打电话时inet_pton
但调用签名要求这是一个struct in_addr
对于 AF_INET(或struct in6_addr
对于 IPv6)。然后你必须用它来构建一个struct sockaddr
用于后面的功能。
按照目前的情况,您将地址的一些字节写入包含实际 IP 地址的字段之前的字段,因此最终您的 sockaddr 字段中只有 IP 的最后 2 个八位字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)