web-dev-qa-db-ja.com

Cのgethostbyname

Cでアプリケーションを作成する方法はわかりませんが、次のような小さなプログラムが必要です。

lh = gethostbyname("localhost");
output = lh->h_name;

出力変数が出力されます。

上記のコードは、PHP MongoDBデータベースドライバーで使用され、コンピューターのホスト名を取得します(ホスト名は、一意のIDを生成するための入力の一部です)。これがホスト名を返すかどうかは疑問です、だから私はいくつかの証拠をお願いします。

コード例は最も役に立ちます。

幸せな日。

11
Matic
_#include <stdio.h>
#include <netdb.h>


int main(int argc, char *argv[])
{
    struct hostent *lh = gethostbyname("localhost");

    if (lh)
        puts(lh->h_name);
    else
        herror("gethostbyname");

    return 0;
}
_

それは時々動作するかもしれませんが、それはホスト名を決定する非常に信頼できる方法ではありません。 (何が返るかは、_/etc/hosts_の設定方法によって異なります)。次のような行がある場合:

_127.0.0.1    foobar    localhost
_

...その後、「foobar」を返します。逆の場合も同じですが、これも一般的ですが、「localhost」を返すだけです。より信頼できる方法は、gethostname()関数を使用することです。

_#include <stdio.h>
#include <unistd.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    char hostname[Host_NAME_MAX + 1];

    hostname[Host_NAME_MAX] = 0;
    if (gethostname(hostname, Host_NAME_MAX) == 0)
        puts(hostname);
    else
        perror("gethostname");

    return 0;
}
_
20
caf

C/UNIXでは、同等のものは次のようになります。

#include <stdio.h>
#include <netdb.h>

int main (int argc, char *argv[]) {
    struct hostent *hstnm;
    if (argc != 2) {
        fprintf(stderr, "usage: %s hostname\n", argv[0]);
        return 1;
    }
    hstnm = gethostbyname (argv[1]);
    if (!hstnm)
        return 1;
    printf ("Name: %s\n", hstnm->h_name);
    return 0;
}

そしてそれが機能する証拠:

$ hstnm localhost
Name: demon-a21pht

しかし、自分で試してみてください。正しい環境が整っていれば問題ありません。

6
paxdiablo

なにが問題ですか?

h_name

ホスト(PC)の正式名。 DNSまたは同様の解決システムを使用している場合、サーバーが応答を返す原因となったのは完全修飾ドメイン名(FQDN)です。ローカルホストファイルを使用する場合、これはIPv4アドレスの後の最初のエントリです。

2
Andrey