getnameinfo()-反向DNS查找(IP地址到主机名)C/C++
getnameinfo() - Reverse DNS lookup (IP Address to hostname) C/C++
对于IPAddress 66.249.68.9("dig-x"正确地说是"crawl-66-249-68-9.googlebot.com"),我可爱的程序声称它是ip68-9-0-0.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;
}
}
调用inet_pton
时使用的是struct sockaddr
,但调用签名要求它是AF_INET的struct in_addr
(或IPv6的struct in6_addr
)。然后,您必须在为后面的函数构建struct sockaddr
时使用它。
目前,您正在将地址的一些字节写入包含实际IP地址的字段之前的字段中,因此您的sockaddr字段中只有IP的最后2个八位字节。
下面是一个分解的C++反向DNS查找示例
// Variables
WSADATA wsaData = { 0 };
int iResult = 0;
DWORD dwRetval;
struct sockaddr_in saGNI;
char hostname[NI_MAXHOST];
char servInfo[NI_MAXSERV];
std::string ip = "YOUR_SERVER_IP";
int port = 25;
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult == 0 /*initialization success*/) {
saGNI.sin_family = AF_INET;
saGNI.sin_addr.s_addr = inet_addr(ip.c_str());
saGNI.sin_port = htons(port);
dwRetval = getnameinfo((struct sockaddr*) & saGNI,
sizeof(struct sockaddr),
hostname,
NI_MAXHOST, servInfo, NI_MAXSERV, NI_NUMERICSERV);
if (dwRetval == 0) {
// save hostname result
}
}
相关文章:
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 如何停止 CLR 主机?
- 如何强制 Thrift 仅接受来自本地主机的连接
- 库达如何将字符**从内核复制到主机
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 如何在 cuda 中将 kd 树从主机复制到驱动程序
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- OpenCL 错误类在主机C++给出错误
- 来自复杂主机数据的阵列火力阵列
- 分离库的主机端和 CUDA 设备端版本
- 如何将HTTPS流量重定向到本地主机:443上的代理?
- Cesanta Mongoose - 连接到本地主机时出现问题
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- 如何实现从 Windows 脚本主机到脚本的事件调度
- 下载 GPU Mats 的矢量到主机
- 为什么主机不显示?(C++和代码处理器问题)
- 从C++中的主机名获取计算机名
- 如何使用PHP将上传到本地主机的一个html文件重定向到磁盘上的另一个html文档