8

http://www.kutukupret.com/2009/09/28/gethostbyname-vs-getaddrinfo/で見つけたこのコード スニペットを使用して、DNS ルックアップを実行しています。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[ ]) {
    struct hostent *h;

    /* error check the command line */
    if(argc != 2) {
        fprintf(stderr, "Usage: %s hostname\n", argv[0]);
        exit(1);
    }

    /* get the host info */
    if((h=gethostbyname(argv[1])) == NULL) {
        herror("gethostbyname(): ");
        exit(1);
    }
    else     
        printf("Hostname: %s\n", h->h_name);

    printf("IP Address: %s\n", inet_ntoa(*((struct in_addr *)h->h_addr)));     
    return 0;
}

私は奇妙な事実に直面しています

./test www.google.com
Hostname: www.l.google.com
IP Address: 209.85.148.103

正常に動作しますが、不完全な IP アドレスを解決しようとすると、次のようになります

./test 10.1.1
Hostname: 10.1.1
IP Address: 10.1.0.1

次のようなエラーが予想されます

./test www.google
gethostbyname(): : Unknown host

しかし、プログラムは機能しているようです。

理由はありますか?

4

2 に答える 2

20

これはバグではなく、inet_aton() 関数の機能です。

説明

inet_aton() 関数は、指定された文字列をインターネット標準のドット表記でネットワーク アドレスに変換し、提供された構造体にアドレスを格納します。

ドット表記を使用して指定された値は、次のいずれかの形式を取ります。

abcd 4 つの部分を指定すると、それぞれが 1 バイトのデータとして解釈され、インターネット アドレスの 4 バイトに左から右に割り当てられます。

abc 3 つの部分からなるアドレスが指定されている場合、最後の部分は 16 ビットの量として解釈され、ネットワーク アドレスの右端の 2 バイトに配置されます。これにより、クラス B ネットワーク アドレスを 128.net.host として指定する場合に、3 部構成のアドレス形式が便利になります。

たとえば、これについて詳しく読むことができます。

于 2011-07-13T10:40:11.007 に答える
8

POSIX.2004によると:

gethostbyname()のname引数は、ノード名でなければなりません。数値アドレス文字列が渡されたときのgethostbyname()の動作は指定されていません。IPv4の場合、数値アドレス文字列はinet_addr()で説明されているドット付き10進表記でなければなりません。

したがって、POSIXの観点から見ると、IPアドレスを渡すときに何も期待できません。

私のシステムでは、manページに次のように書かれています。

nameがIPv4またはIPv6アドレスの場合、ルックアップは実行されず、gethostbyname()は単にnameをh_nameフィールドにコピーし、それに相当するstructin_addrを返されたhostent構造のh_addr_list[0]フィールドにコピーします。

不完全なIPアドレスを渡した場合に何が起こるかについては何も述べていないため、観察した動作を含め、何かが起こる可能性があります。

システムでの実装方法の詳細についてgethostbynameは、関数やソースコード(利用可能な場合)のドキュメントを確認してください。

于 2011-07-13T10:15:12.637 に答える