首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >getaddrinfo() - Linux与Windows

getaddrinfo() - Linux与Windows
EN

Stack Overflow用户
提问于 2013-07-02 16:02:07
回答 2查看 7.6K关注 0票数 2

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

代码语言:javascript
运行
复制
   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网络编程指南”演变而来的。

导致这种情况的代码如下:

代码语言:javascript
运行
复制
      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;
}

谢谢!

EN

回答 2

Stack Overflow用户

发布于 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的传入连接。

票数 2
EN

Stack Overflow用户

发布于 2013-07-03 14:33:45

编码一致性发生了什么变化?

代码语言:javascript
运行
复制
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 Animalanswer涵盖了很多相关的方面,尽管我还没有验证微软特定的细节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17420427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档