在Linux中,我可以在本地套接字getaddrinfo(NULL,port,&hints,&servinfo)上调用getaddrinfo()来创建如下列表:
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网络编程指南”演变而来的。
导致这种情况的代码如下:
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;
}谢谢!
发布于 2013-07-03 10:41:50
有一些神奇的东西叫做man pages。例如,man 3 getaddrinfo明确地说
如果在hints.ai_flags中指定了AI_PASSIVE标志,并且node为NULL,则返回的套接字地址将适用于
bind()将accept()连接的套接字。返回的套接字地址将包含“通配符地址”( IPv4地址为INADDR_ANY,IPv6地址为IN6ADDR_ANY_INIT )。通配符地址由打算接受任何主机网络地址上的连接的应用程序(通常是服务器)使用。如果节点不为空,则忽略AI_PASSIVE标志。
getaddrinfo()函数的用途很简单:它尽量将用户指定的字符串转换为应用程序可以用来创建套接字的数字数据,该套接字监听传入的连接或连接到的套接字。
getaddrinfo()是在POSIX.1-2001 (和RFC 2553)中指定的,而微软以从不遵循它可以扩展或颠覆的标准而闻名,所以它在Windows中当然是一个完全不同的功能。相关的MSDN page说它“提供了从ANSI主机名到地址的独立于协议的转换”。
程序的输出是通配符地址的列表,因为node (第一个参数)是NULL,并且标志中有AI_PASSIVE,所以程序可以(尝试)绑定到通配符地址列表,以侦听到您指定的port的传入连接。
发布于 2013-07-03 14:33:45
编码一致性发生了什么变化?
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;首先使用sizeof(hints)将hints置零;然后设置一些值;然后使用sizeof hints再次将其置零(不一致);然后再次设置一些值并忽略其他值(特别是AI_PASSIVE标志)。如果你是始终如一的,编程通常是最容易的。避免(或多或少)重复做同一件事也是明智的。选择其中一个序列,但不要同时包含这两个序列。
这是否真的是您问题的根源是另一个问题。Nominal Animal的answer涵盖了很多相关的方面,尽管我还没有验证微软特定的细节。
https://stackoverflow.com/questions/17420427
复制相似问题