将数据从 getaddrinfo() 转换为 struct hostent
converting data to struct hostent from getaddrinfo()
我正在将旧代码替换为 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 *server_host;
为了与其他代码兼容。
我可以使用 gethostbyname() 直接获取主机结构,但我想避免它。
你有什么建议?
没有将 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);
我正在将旧代码替换为 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 *server_host;
为了与其他代码兼容。 我可以使用 gethostbyname() 直接获取主机结构,但我想避免它。 你有什么建议?
没有将 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);