Link to home
Start Free TrialLog in
Avatar of gshriki
gshriki

asked on

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.
Avatar of kulina
kulina

Did you initialize winsock (using WSAStartup())?
Avatar of Paul Maker
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
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.
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.

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!!!
>>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.
Avatar of gshriki

ASKER

Thanks everyone, but i managed to take the gethostbyaddr out of the code, and i'm not using it at all.

Thanks again...
ASKER CERTIFIED SOLUTION
Avatar of kulina
kulina

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of gshriki

ASKER

Yes,
Because I already have the IP adderss, I didn't need the hostent structure and the gethostbyaddr command...



I would say that "kulina" deservse the points on that one.