getaddrinfo()
在 Linux 中,我可以使用对本地套接字的调用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 的)似乎都失败了。
getaddrinfo()
linux和windows在使用上的预期区别是什么?
另外-我知道这种问题会使问题变得复杂-但是第一个程序的输出到底告诉了我什么?这些是内核可以为该端口提供的唯一组合吗?
是的,这个问题是从相当著名的“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;
}
谢谢!