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 以外のもの) に関連する呼び出しは失敗するようです。
getaddrinfo()
Linux と Windowsの使用方法の意図的な違いは何ですか?
また、この種の質問が 2 つの問題になることはわかっていますが、最初のプログラムからの出力は正確には何を示しているのでしょうか。カーネルがそのポートに対して尊重できる唯一の組み合わせですか?
はい、この質問はかなり有名な「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;
}
ありがとう!