get host name by IP address


 
Thread Tools Search this Thread
Top Forums Programming get host name by IP address
# 1  
Old 12-12-2009
get host name by IP address

I'm trying to write a function to get the host name of any given IP address.

I'm trying to follow this manual but I'm stuck. I'm using gcc and Linux. Any ideas?

getnameinfo()

Code:
#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>

char *GETHOSTBYADDR(const char *INADDR_ANY)
{
    struct sockaddr_in
    {
        short        sin_family;    // e.g. AF_INET, AF_INET6
        unsigned short    sin_port;    // e.g. htons(80)
        struct in_addr    sin_addr;    // see struct in_addr, below
        char        sin_zero[8];    // zero this if you want to
    };

    struct in_addr
    {
        unsigned long s_addr;    // load with inet_pton()
    };

    struct sockaddr_in *SA;

    SA.sin_addr.s_addr = INADDR_ANY; // set the local IP address
    SA.sin_port = htons(80); // set the port number

    static char HOSTNAME[128] = "";

    getnameinfo(SA, sizeof(SA), HOSTNAME, sizeof(HOSTNAME), NULL, 0, NI_NAMEREQD);

    return HOSTNAME;
}

int main(void)
{
    puts(GETHOSTBYADDR("209.85.229.106")); // testing on google's IP

    return 0;
}


Last edited by limmer; 12-26-2009 at 03:52 PM..
# 2  
Old 12-12-2009
for starters -
Code:
sizeof(SA)

This returns what? the size of a pointer or the size of the struct? Hint: SA is a __ not a struct.
# 3  
Old 12-14-2009
gcc complains about these errors but I do not understand how to solve them. In other sites I see sin_addr and sin_port not inside a structure. Passing an int to argument 1 of getnameinfo does not solve the warning.

Anybody can help?

Quote:
a.c:12: error: expected ‘)’ before numeric constant
a.c: In function ‘GETHOSTBYADDR’:
a.c:29: error: request for member ‘sin_addr’ in something not a structure or union
a.c:30: error: request for member ‘sin_port’ in something not a structure or union
a.c:34: warning: passing argument 1 of ‘getnameinfo’ from incompatible pointer type

Last edited by limmer; 12-14-2009 at 06:07 PM..
# 4  
Old 12-14-2009
Why are you re-defining sockaddr_in and in_addr? the definitions are already in the header files. Besides that there is no need for the structures. The only structure you need is hostent.

The way your handling SA is not correct. You define it as a pointer but never allocate memory for it. You should also be using the -> operator instead of . when accessing structure members.

Why are you calling getnameinfo()? You should call gethostbyaddr().

I know what your trying to do but you are way off. The majority of the code does not apply to what your doing.




Code:
NAME
       gethostbyaddr, gethostbyname - network host database functions

SYNOPSIS
       #include <netdb.h>

       struct hostent *gethostbyaddr(const void *addr, socklen_t len,
              int type);
       struct hostent *gethostbyname(const char *name);

# 5  
Old 12-17-2009
I finally got it working:

Code:
char *IPtoHOST(const char *IP) // returns host name from IP address. If failure, returns IP address.
{
	static char BUFFER[65] = "";

	struct sockaddr_in SIN; // create a struct of sockaddr_in type
	memset(&SIN, 0, sizeof(SIN)); // zero SIN struct before use
	SIN.sin_family		= AF_INET; // specify address family
	SIN.sin_addr.s_addr	= inet_addr(IP); // pass the IP
	SIN.sin_port		= 0; // specify port: 0 is chosen by the system. htons(port) is for manual specification (it seems to work specifying any port so I let system choose)

	getnameinfo( (struct sockaddr *)&SIN /* type cast sockaddr_in to sockaddr */, sizeof(SIN), BUFFER, 64, NULL, 0, 0); // If the last parameter (flags) is 0 and if getnameinfo fails, then the IP is written into BUFFER instead of the host name

	return BUFFER;
}


Last edited by limmer; 04-08-2010 at 04:38 PM..
# 6  
Old 12-17-2009
Quote:
Originally Posted by limmer
I finally got it working:
I am curious - why would you do it this way instead of using gethostbyaddr()?
# 7  
Old 12-18-2009
Quote:
Originally Posted by frank_rizzo
I am curious - why would you do it this way instead of using gethostbyaddr()?
gethostbyaddr() is deprecated in favor of getnameinfo().
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. IP Networking

IP address to host name conversion

hi, i want to get the hostname for the specified IP address. # host www.google.com www.google.com has address 173.194.69.104 www.google.com has address 173.194.69.105 www.google.com has address 173.194.69.106 www.google.com has address 173.194.69.147 www.google.com has address... (3 Replies)
Discussion started by: kavitha rao
3 Replies

2. UNIX for Dummies Questions & Answers

Command for Host Name to IP Address or Vice Versa

Hi, In unix or linux is there any command exist to identify Host Name to IP Address or Vice Versa? Thanks in advance (6 Replies)
Discussion started by: nag_sathi
6 Replies

3. Red Hat

Static IP Address setup for vm as well as the host system

Hello, Greetings!! I have a server with 3 TB of disk space and 12 GB RAM and a i7 processor. What I did thus far is to install Oracle Enterprise Linux (OEL 5.7)as the host system and install Oracle Virtual box and created 3 VM's. Installed OEL 5.7 on one of the VM, working on installing... (1 Reply)
Discussion started by: rparavastu
1 Replies

4. UNIX for Advanced & Expert Users

Help! How to find the local host after few ssh hops to remote host???

I do a ssh to remote host(A1) from local host(L1). I then ssh to another remote(A2) from A1. When I do a who -m from A2, I see the "connected from" as "A1". => who -m userid pts/2 2010-03-27 08:47 (A1) I want to identify who is the local host who initiated the connection to... (3 Replies)
Discussion started by: gomes1333
3 Replies

5. Solaris

No value in Ethernet address and Host ID at Ok prompt

Hi All, In Ultra 10 at time system is not displaying value for Ethernet address and Host ID. Also, when i am trying to change the value of environment variables i am getting below message and value is not changing Thanks (4 Replies)
Discussion started by: kumarmani
4 Replies

6. Solaris

How to get the IP address / Host name of client machine

Hi How to get the IP address / Host name of a particular user connected to Unix Server. For example: If used 'DevUser1' is connected to Unix server. I need to find out from which PC this connection has been made. How can this be achieved? Thanks (6 Replies)
Discussion started by: MVL
6 Replies

7. Programming

host name to IP address

There's a piece in a C program I'm writing (Linux) that simply needs to take a host name and return an IP address (e.g., take 'mail.gnu.org' and return 199.232.76.166). I've gotten a successful status from getaddrinfo, but don't see any of the fields in the result structure that has what I'm... (7 Replies)
Discussion started by: cleopard
7 Replies

8. Solaris

Host ID vs MAC Address

Hi, I've got a Sun Solaris machine with host ID (840f8e57) and MAC address (0:14:4f:f:8e:57), how do I: 1. Write the MAC address in standard (IEEE 802) format, i.e. xx-xx-xx-xx-xx-xx? Do I need to add 0's before or after the 'f', i.e. 00-14-4f-0f-8e-57 or 00-14-4f-f0-8e-57? 2. What is... (4 Replies)
Discussion started by: TheBlueSky
4 Replies

9. UNIX for Advanced & Expert Users

Host IP address for a telnet session

I am using Tru64UX 5.1a on alphaserver 4100. Users access the application through Telnet sessions to this server. My requirement is to limit the users login through their PCs only. Is there any way I can accomplish this on the unix box ? I want to include a script in the .profile ( or... (1 Reply)
Discussion started by: shauche
1 Replies

10. UNIX for Advanced & Expert Users

Server name + IP address removed from host table after rebooting

Hi, I have a problem with a Unix server (SCO Unix version 3.2). If this server is rebooted the own server name and it's IP address is removed from the host table. How is this possible? How can i solve this problem? (3 Replies)
Discussion started by: FIRE
3 Replies
Login or Register to Ask a Question