我有一个包含IP地址的变量。我正在尝试对此进行nslookup,而不是返回DNS名称,我得到0。我在Linux环境中。目的IP来自一个 vector (字符串dest_ip = vector [2])。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <vector>
#include <algorithm>
#include <iterator>
#include <sstream>
using namespace std;
void split(const std::string& str, std::vector<std::string>& v) {
std::stringstream ss(str);
ss >> std::noskipws;
std::string field;
char ws_delim;
while(1) {
if( ss >> field )
v.push_back(field);
else if (ss.eof())
break;
else
v.push_back(std::string());
ss.clear();
ss >> ws_delim;
}
}
int main()
{
string input_line;
while(cin){
getline(cin, input_line);
for(int i=0; input_line[i]; i++)
if(input_line[i] == ':') input_line[i] = ' ';
for(int i=0; input_line[i]; i++)
if(input_line[i] == '/') input_line[i] = ' ';
std::vector<std::string> v;
split(input_line, v);
string dest_ip = v[4];
struct hostent *he;
int i,len,type;
len = dest_ip.length();
type=AF_INET;
he = gethostbyaddr(dest_ip.c_str(),len,type);
cout<<"Hostname: "<<he<<"\n";
return 0;
}
同样,我没有收到主机名,而是得到0。
最佳答案
您不能将c样式字符串(即以null终止)直接传递给gethostbyaddr
。
您需要创建一个struct in_addr
并将指向创建的结构的指针作为第一个参数传递给gethostbyaddr
。要从struct in_addr
生成char const*
,请使用 inet_aton
。
以下示例摘自man gethostbyaddr:
示例
const char *ipstr = "127.0.0.1";
struct in_addr ip;
struct hostent *hp;
if (!inet_aton(ipstr, &ip))
errx(1, "can't parse IP address %s", ipstr);
if ((hp = gethostbyaddr((const void *)&ip, sizeof ip, AF_INET)) == NULL)
errx(1, "no name associated with %s", ipstr);
printf("name associated with %s is %s\n", ipstr, hp->h_name);
我如何做进一步检查以查明出了什么问题?
如果您对
gethostbyaddr
的使用返回了NULL
,则应通过查看变量h_errno
来检查出了什么问题。h_errno
可以具有以下定义的值之一:HOST_NOT_FOUND
TRY_AGAIN
NO_RECOVERY
NO_DATA
有关该问题的更多详细信息,请查阅您的手册。
您的代码段是完全错误的。.
您提供的摘录甚至无法编译,但是您以某种方式显示了您要完成的工作,但我不能确定这一点。
这篇文章包含应被视为“有根据的猜测”的详细信息。
OP更改了他的职位。