我有一个包含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:

示例

  • 打印出与特定IP地址关联的主机名:
    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更改了他的职位。

    09-06 13:43