views:

299

answers:

3
+1  Q: 

gethostbyname in C

I don't know how to write applications in C, but I need a tiny program that does:

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

output variable is to be printed.

The above code is used in PHP MongoDB database driver to get the hostname of the computer (hostname is part of an input to generate an unique ID). I'm skeptical that this will return the hostname, so I'd like some proof.

Any code examples would be most helpful.

Happy day,

Matic

A: 

what is wrong?

h_name

The official name of the host (PC). If using the DNS or similar resolution system, it is the Fully Qualified Domain Name (FQDN) that caused the server to return a reply. If using a local hosts file, it is the first entry after the IPv4 address.

Andrey
And of course DNS is not going to be used for "localhost", so it's the local hosts file that's relevant. *If* the entry in the local hosts file has both "localhost" and the real hostname associated with the same address (127.0.0.1) *and* the real hostname is the first entry, then h_name will return the real hostname.
David Gelhar
@David Gelhar: localhost is not a name of computer. localhost resolves to 127.0.0.1 but there is no back conversion. http://en.wikipedia.org/wiki/Localhost
Andrey
@Andrey right, but the point is that if /etc/hosts looks like `127.0.0.1 realname.com localhost` then `gethostbyname("localhost")` will return "realname.com" in h_name, but if the order is reversed, it will return "localhost" (see caf's answer).
David Gelhar
+2  A: 

In C/UNIX, the equivalent would be something like:

#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;
}

and the "proof" that it works, proof in quotes because, in all honesty, you have no idea who I am - maybe I just posted any old rubbish to try and fool you :-)

$ hstnm localhost
Name: demon-a21pht

But try it yourself. Provided you have the correct environnment, it should be fine.

paxdiablo
+2  A: 
#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;
}

It is not a very reliable way of determining the hostname, though it may sometimes work. (what it returns depends on how /etc/hosts is set up). If you have a line like:

127.0.0.1    foobar    localhost

...then it will return "foobar". If you have it the other way around though, which is also common, then it will just return "localhost". A more reliable way is to use the gethostname() function:

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

int main(int argc, char *argv[])
{
    char hostname[HOST_NAME_MAX];

    if (gethostname(hostname, sizeof hostname) == 0)
        puts(hostname);
    else
        perror("gethostname");

    return 0;
}
caf