gpt4 book ai didi

c - getaddrinfo() - Linux 与 Windows

转载 作者:可可西里 更新时间:2023-11-01 10:26:10 26 4
gpt4 key购买 nike

在 Linux 中,我可以调用 getaddrinfo() 到本地套接字 getaddrinfo(NULL,port,&hints,&servinfo) 来创建这样的列表:

   IPv4: 0.0.0.0
| socktype: 1 |protocol: 6 IPv4: 0.0.0.0
| socktype: 2 |protocol: 17 IPv4: 0.0.0.0
| socktype: 3 |protocol: 0 IPv6: ::
| socktype: 1 |protocol: 6 IPv6: ::
| socktype: 2 |protocol: 17 IPv6: ::
| socktype: 3 |protocol: 0

而在 Windows 中,任何与本地机器相关的调用 "NULL""localhost""127.0.0.1"(实际上, 任何不是 URL 的东西)似乎都失败了。

在 linux 和 windows 之间使用 getaddrinfo() 的预期区别是什么?

此外 - 我知道这种问题会使问题变得复杂 - 但第一个程序的输出究竟告诉我什么?这些是内核可以为该端口提供的唯一组合吗?

是的,这道题是从相当有名的《Beej's Guide to network programming》演化而来的。

导致这个的代码是这样的:

      struct addrinfo hints,*ai,*p;

memset(&hints,0,sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE;
int error;

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6
hints.ai_socktype = SOCK_STREAM;

if ((error = getaddrinfo("www.example.com", "http", &hints, &ai)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error));
exit(1);
} else cout <<"Success with a URL\n";


if (error=(getaddrinfo("208.117.45.202",&port,&hints,&ai))){
cout<<"Cannot resolve any usable ports! : "<<gai_strerror(error)<< " : "<<error;
if (ai == NULL) return -5;
}

谢谢!

最佳答案

这些神奇的东西叫做man pages .例如,man 3 getaddrinfo明确地说

If the AI_PASSIVE flag is specified in hints.ai_flags, and node is NULL, then the returned socket addresses will be suitable for bind()ing a socket that will accept() connections. The returned socket address will contain the "wildcard address" (INADDR_ANY for IPv4 addresses, IN6ADDR_ANY_INIT for IPv6 address). The wildcard address is used by applications (typically servers) that intend to accept connections on any of the hosts's network addresses. If node is not NULL, then the AI_PASSIVE flag is ignored.

getaddrinfo() 函数的目的很简单:它尽力将用户指定的字符串转换为应用程序可用于创建套接字的数字数据,无论是监听传入连接,或一个用于连接。

getaddrinfo()POSIX.1-2001 中指定(和 RFC 2553 ),并且微软以从不遵循它可以扩展或变态的标准而闻名,所以当然它在 Windows 中是一个完全不同的功能。相关MSDN page说它“提供从 ANSI 主机名到地址的与协议(protocol)无关的转换。”

你的程序的输出,因为node(第一个参数)是NULL,而你在flags中有AI_PASSIVE,是您的程序可以(尝试)绑定(bind)的通配符地址列表,以监听到您指定的端口的传入连接。

关于c - getaddrinfo() - Linux 与 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17420427/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com