【问题标题】:converting data to struct hostent from getaddrinfo()从 getaddrinfo() 将数据转换为 struct hostent
【发布时间】:2021-12-02 00:29:00
【问题描述】:

我正在将旧代码替换为 linux。我正在使用:

server_host = getipnodebyname(host.c_str(), AF_INET, 0, &err_num);

server_host = getipnodebyaddr(addr, sizeof(INET_ADDRSTRLEN), AF_INET, &err_num);

它必须被新的 getaddrinfo() 替换。

在我添加的那一刻:

struct addrinfo *p_addr = (struct addrinfo *) NULL;
struct addrinfo hints={0};                                          //Initialize the addrinfo hints
char addr[INET_ADDRSTRLEN]={0};
int result = 0;

memset(&hints, 0, sizeof(hints));

hints.ai_family = AF_INET;                                          //Request for IPV4 ADDRESSES ONLY

result = getaddrinfo(host.c_str(), NULL, &hints, &p_addr);

但我需要在 hostent 结构中填充收集到的信息:

hostent     *server_host;

为了与其他代码的兼容性。 我可以使用 gethostbyname() 直接获取主机结构,但我想避免它。 你有什么建议?

【问题讨论】:

    标签: c++ sockets network-programming posix


    【解决方案1】:

    没有将addrinfo 转换为hostent 的C 库函数。您必须使用来自addrinfo 的数据自己构建hostent,例如:

    #include <vector>
    
    addrinfo hints = {0};
    hints.ai_family = AF_INET;
    hints.ai_flags = AI_CANONNAME;
    
    addrinfo *p_addrs = NULL;
    
    int result = getaddrinfo(host.c_str(), NULL, &hints, &p_addrs);
    if (result != 0) ... // error handling...
    
    std::vector<in_addr*> in_addrs;
    
    for(addrinfo *p_addr = p_addrs; p_addr != NULL; p_addr = p_addr->ai_next) {
        in_addrs.push_back(&reinterpret_cast<sockaddr_in*>(p_addr->ai_addr)->sin_addr);
    }
    in_addrs.push_back(NULL);
    
    hostent hst;
    h.h_name = p_addrs->ai_canonname;
    h.h_aliases = NULL;
    h.h_addrtype = AF_INET;
    h.h_length = sizeof(in_addr);
    h.h_addr_list = reinterpret_cast<char**>(&in_addrs[0]/* or: in_addrs.data() */);
    
    // use hst as needed ...
    
    freeaddrinfo(p_addrs);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 2013-03-05
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      相关资源
      最近更新 更多