[英]How to replace inet_pton with getaddrinfo
考虑 inet_pton 函数:
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst)
据我了解,该函数将点分十进制形式的 IP 地址字符串作为输入 (src),并将该字符串转换为字节形式,这是某些网络编程任务所需的。 事实上,src 被转换为一个结构体 in_addr,它被复制到 dst(提供 af = AF_INET)。 在这个结构中,应该有一个字节形式的 IP 地址条目(如果我错了,请纠正我!)。
我希望能够使用 inet_pton 但不是以点分十进制形式给出 src,我想给出一个可以由我的 DNS 服务器解析的名称。
示例:而不是inet_pton(AF_INET, "10.70.1.114", buf)
我想使用inet_pton(AF_INET, "myPC", buf)
我在想,也许我之前可以使用getaddrinfo
和getnameinfo
来解析我的名字。 我在想一个这样的函数:
char* resolvename(const char* name)
{
struct addrinfo *infoptr, hints;
char host[256];
hints.ai_family=AF_INET;
int result = getaddrinfo(name,NULL,&hints,&infoptr);
if(result){
fprintf(stderr, "getaddrinfo: %s\n", gai_stderror(result));
exit(1);
}
getnameinfo(infoptr->ai_addr, infoptr->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
return host;
}
然后我应该能够做这样的事情:
mySrc = resolvename("myPC");
inet_pton(AF_INET, mySrc, buf);
这有任何意义吗? 只是说:我没有任何网络编程经验。 所有这些功能对我来说都很新,所以请赐教!
char host[256]; ... return host;
您返回指向自动数组的指针。 数组在作用域结束时自动销毁,因此您返回一个悬空指针。 通过悬空指针进行间接访问的行为是未定义的。
此外,由于未能调用freeaddrinfo
,您会泄漏内存。
getaddrinfo
返回sockaddr
的列表,其中已包含字节形式的 IP。 如何取出它的示例:
for (; infoptr; infoptr = infoptr->ai_next) {
if (infoptr->ai_family == AF_INET) {
assert(infoptr->ai_addrlen == sizeof(sockaddr_in));
sockaddr_in addr;
std::memcpy(&addr, infoptr->ai_addr, sizeof addr);
std::memcpy(buf, addr.sin_addr, sizeof addr.sin_addr);
break;
}
}
如果你很聪明,理论上可能有一种方法可以使用 offsetof 来摆脱中间 memcpy 到本地sockaddr_in
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.