【发布时间】:2013-07-03 14:33:45
【问题描述】:
在 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)相关的调用似乎都失败了。
getaddrinfo() 在 linux 和 windows 之间的使用有什么区别?
另外 - 我知道这种问题会使问题变得复杂 - 但是第一个程序的输出到底告诉我什么?这些是内核可以支持该端口的唯一组合吗?
是的,这个问题是从相当著名的“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;
}
谢谢!
【问题讨论】:
-
您可能应该显示更多代码。 MSDN docs for
getaddrinfo()非常详尽,听起来确实应该可以工作,即使对于 localhost 也是如此。 -
你确定你在windows平台上运行服务器(例如XAMPP)?
-
不,没有服务器。我想知道作为服务器的状态是否会对
getaddrinfo()调用的行为产生影响……但其他问题让我倾向于考虑操作系统拆分…… -
尝试安装 XAMPP,然后运行 localhost 服务器,并尝试运行您的代码,并告诉我们它是否有效 :)
-
我确实做到了.. 但我从来没有特别关注过这些,我会的,谢谢。我想我希望首先对底层套接字系统有一个基本的理解......这些库不会增加太多开销,是吗? ....如果您还记得一部非常著名的美国电影中的某句台词:i.imgur.com/FlzYTja.jpg
标签: c linux windows network-programming