0

IP のホスト名を取得する必要がある場合、どのポートを使用すればよいですか? getnameinfo() はどこからホスト名を取得しますか?

struct sockaddr_in sa;
sa.sin_family    = AF_INET;
sa.sin_port    = htons(?); // which port ?
inet_pton(AF_INET, "x.x.x.x", &(sa.sin_addr));

char host[NI_MAXHOST];
getnameinfo((struct sockaddr *)&sa, sizeof(sa), host, NI_MAXHOST, NULL, 0, NI_NAMEREQD);

puts(host);
4

2 に答える 2

3

serv引数と引数を使用しない場合servlen、ポート番号は関係ありません。それ以外の場合は、ポート番号 (ポート 22、ポート 25 など) でサービスを検索するために使用されます(詳細については、を参照してください)。"ssh""smtp"/etc/services

getnameinfo()さまざまな場所からホスト名を取得できます ( を使用すると、さまざまな種類の名前解決のためにさまざまなモジュールを有効にすることができます) nsswitch.conf。典型的なデスクトップ Linux ディストリビューションでは、最初に を調べ、次に に従って DNS サーバーにクエリを実行libnssすることを期待しています。/etc/hosts/etc/resolv.conf

于 2013-02-07T19:38:35.457 に答える
1

http://www.kernel.org/doc/man-pages/online/pages/man3/getnameinfo.3.htmlから:

sa 引数は、入力 IP アドレスとポート番号を保持するサレン サイズの汎用ソケット アドレス構造 (タイプ sockaddr_in または sockaddr_in6) へのポインタです。引数 host と serv は、getnameinfo() がそれぞれホスト名とサービス名を含む null で終わる文字列を配置する、呼び出し元が割り当てた (それぞれサイズが hostlen と servlen の) バッファーへのポインターです。

呼び出し元は、NULL の host (または serv) 引数またはゼロの hostlen (または servlen) 引数を指定することによって、ホスト名 (またはサービス名) が不要であることを指定できます。ただし、ホスト名またはサービス名の少なくとも 1 つを要求する必要があります。

そのため、ホスト名だけに関心がある場合は、サービス名のバッファーを提供しないでください。

これがどこから来たのかについては、他の人に任せますが、興味がある場合は、コードは glibc にあります。

于 2013-02-07T19:53:48.630 に答える