• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 854
  • Last Modified:

gethostbyaddr

Hey,

I have the following code :

/********/
char server_ip[64] = "1.2.3.4";
struct hostent *hp;
unsigned int addr;

addr = inet_addr(server_ip);
hp = gethostbyaddr((char *)&addr,4,AF_INET);
if (hp == NULL)
{
   printf("Cannont resolve address [%s]: Error %d",server_ip,WSAGetLastError());
}
/*********/

and when I run it, I get the error

Cannot resolve address [1.2.3.4]: Error 11004

Why is that ? why does it try to resolve the address ?
Do I need DNS here ? and is so, WHY ???

Thanks,
   Gilad.
0
gshriki
Asked:
gshriki
1 Solution
 
kulinaCommented:
Did you initialize winsock (using WSAStartup())?
0
 
makerpCommented:
11004, the requested name is valid and was found in the database, but it does not have the correct data resolved for.

what this mneans i do not know.

is 1.2.3.4 a real ip address of a machine on your network?, what is it you are trying to do
0
 
kulinaCommented:
Use struct in_addr addr instead of unsigned int, i.e:

#include <stdio.h>
#include <winsock2.h>

#pragma comment( lib, "ws2_32.lib" )
int initWinSock(void);

int main( int argc, char *argv[] )
{
    struct hostent *host;
    struct in_addr addr;

    if( argc != 2 ){
        printf( "Usage: host <hostname>\n" );
        return 1;
    }

    if( initWinSock() ){
        printf( "Error! Can't initialize winsock\n" );
        return 1;
    }

    // Check whether argument is an IP address or a DNS
    addr.s_addr = inet_addr( argv[1] );
    if( addr.s_addr == INADDR_NONE ){
        // Not an IP address string, maybe a DNS
        host = gethostbyname( argv[1] );
    }
    else{
        // A valid IP address string
        host = gethostbyaddr( (const char *)&addr,
                        sizeof(struct in_addr), AF_INET );
    }

    // Check return value
    if( host == NULL ){
        printf( "Cannot resolve address %s. Error code: %d\n",
                argv[1], WSAGetLastError() );
        return 1;
    }

    // Print host info
    printf( "\nHost Name........: %s", host->h_name );
   
     WSACleanup();
     return 0;
}

/* initiates the use of winsock by a process */
int initWinSock()
{
   WORD wVersionRequested;
   WSADATA wsaData;
   int err;
   
   wVersionRequested = MAKEWORD( 1, 1 );
   err = WSAStartup( wVersionRequested, &wsaData );

   if ( err != 0 ){
       /* no usable winsock found (for requested version) */
       return -1;
   }

   return 0;
}

Try using it this way:
host 64.58.76.22

Result:
Host Name........: w4.dcx.yahoo.com

Hope this helps.
0
Improve Your Query Performance Tuning

In this FREE six-day email course, you'll learn from Janis Griffin, Database Performance Evangelist. She'll teach 12 steps that you can use to optimize your queries as much as possible and see measurable results in your work. Get started today!

 
kulinaCommented:
By the way, 1.2.3.4 is indeed unresolved IP address. If you ping it you get:
ping 1.2.3.4

Pinging 1.2.3.4 with 32 bytes of data:

Request timed out.
Request timed out.
Request timed out.
Request timed out.

0
 
sateesh_babuCommented:
I get from your code that you are trying to use gethostbyname. If you want to get a correct result, then just give the IP address of your machine and test the program.
In Unix you can get the ip address of your machine, by
ping -s <hostname>
If you want your hostname, type hostname.

In windows you can get the IP address using ipconfig command.

Hope this helps!!!
0
 
kulinaCommented:
>>Why is that?
"gethostbyaddr()" needs "in_addr" structure as a first parameter, cast into char *. You passed unsigned int which is wrong.

>>why does it try to resolve the address?
By resolve it means that "gethostbyaddr()" will try to get information about the host whose IP address is stored in "in_addr" member "s_addr" (remember, "in_addr" is passed as the first parameter). If this IP address exists "gethostbyaddr()" will 'fill out' a hostent structure with the information about that host (i.e. host name, alias, other ip addresses etc). "gethostbyaddr()" will then return a pointer to that hostent structure

>>Do I need DNS here ? and is so, WHY ???
You do not need to pass domain (or host) name to "gethostbyaddr()" since it wouldn't know what to do with it. At some point, probably a memory access violation would happen. On the other hand, as you can see from my code example above, you may pass the DNS name to "gethostbyname()" function. Both functions are used to retrieve information about IP hosts, which is stored in hostent structure. They just do it differently, i.e.
gethostbyname( char *hostname )
retrieves information about host based on the host name i.e.
struct hostent *he = gethostbyname( "www.yahoo.com" );

gethostbyaddr( (char *)struct in_addr addr, sizeof(struct in_addr), AF_INET )
retrieves information based on the IP address that is converted to unsigned long format using inet_addr. See http://www.pc-help.org/obscure.htm for information on different representations of IP address.

If you have more questions let me know.
0
 
gshrikiAuthor Commented:
Thanks everyone, but i managed to take the gethostbyaddr out of the code, and i'm not using it at all.

Thanks again...
0
 
kulinaCommented:
Good news! Would you mind elaborating on details of your workaround?
Thanks.
0
 
gshrikiAuthor Commented:
Yes,
Because I already have the IP adderss, I didn't need the hostent structure and the gethostbyaddr command...


0
 
peter_sheynkmanCommented:

I would say that "kulina" deservse the points on that one.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

The Firewall Audit Checklist

Preparing for a firewall audit today is almost impossible.
AlgoSec, together with some of the largest global organizations and auditors, has created a checklist to follow when preparing for your firewall audit. Simplify risk mitigation while staying compliant all of the time!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now