【发布时间】:2019-11-27 15:40:50
【问题描述】:
考虑 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);
这有任何意义吗?只是说:我没有任何网络编程经验。所有这些功能对我来说都很新,所以请赐教!
【问题讨论】:
-
您确定要询问 C++ 而不是 C?因为它看起来更像 C 而不是 C++。
-
getaddrinfo已经为您提供了 IP 地址。目前尚不清楚通过将其转换为char字符串,然后通过inet_pton立即返回到相同的确切IP 地址,您期望完成什么。这就像打印一封电子邮件,在木桌上扫描,然后转发附件。 -
@SamVarshavchik:我遇到了使用 inet_pton 的代码:
if (inet_pton(AF_INET, split[9].c_str(), buf)) {。所以,split[9].c_str()是从文件中读取的一些字符串。而这个字符串 - 以现在的代码方式 - 需要是一个点分十进制形式的 IP。但我希望这个字符串是“myPC”。当它是“myPC”并且我运行我的问题中给出的代码时,这在理论上可行吗? -
你错过了我的意思。你不需要“myPC”,你已经有了来自
getaddrinfo()的myPC的IP地址。 -
哦,我明白了。感谢您指出这一点!
标签: c++ sockets network-programming