converting host to ip by sockaddr_in gethostname etc

48,000

Solution 1

Try something like this:

  struct hostent        *he;
  struct sockaddr_in  server;
  int                 socket;

  const char hostname[] = "localhost";

  /* resolve hostname */
  if ( (he = gethostbyname(hostname) ) == NULL ) {
      exit(1); /* error */
  }

  /* copy the network address to sockaddr_in structure */
  memcpy(&server.sin_addr, he->h_addr_list[0], he->h_length);
  server.sin_family = AF_INET;
  server.sin_port = htons(1337);

  /* and now  you can connect */
  if ( connect(socket, (struct sockaddr *)&server, sizeof(server) ) {
      exit(1); /* error */
  }

I wrote this code straight from my memory so I cannot guarantee that it works but I am pretty sure it should be OK.

Solution 2

This shell script compiles correct C code, which I believe will do what you want it to:

rm -f 1; cat > 1.c <<EOD; gcc -Wall -Werror 1.c -o 1; ./1

#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>

void
do_one(char *the_name,int port_number)
{
  int                  my_socket;

  char               **pointer_pointer;

  char                 answer[INET_ADDRSTRLEN];

  struct hostent      *returned_host;

  struct sockaddr_in   outgoing_address;

  printf("==========\n");

  printf("destination         : %s:%d\n",the_name,port_number);

  returned_host=gethostbyname(the_name);

  if(returned_host==NULL)
  {
    fprintf(stderr,"error %d\n",h_errno);

    return;
  }

  printf("host's official name: %s\n",returned_host->h_name);

  for(pointer_pointer=returned_host->h_aliases;
      *pointer_pointer;
      pointer_pointer++
     )
  {
    printf("alias               : %s\n",*pointer_pointer);
  }

  for(pointer_pointer=returned_host->h_addr_list;
      *pointer_pointer;
      pointer_pointer++
     )
  {
    inet_ntop(AF_INET,(void *)*pointer_pointer,answer,sizeof(answer));

    printf("IP address          : %s\n",answer);

    my_socket=socket(AF_INET,SOCK_STREAM,0);

    if(my_socket<0)
    {
      perror("socket()");

      return;
    }

    memset(&outgoing_address,0,sizeof(outgoing_address));
    outgoing_address.sin_family=AF_INET;
    outgoing_address.sin_port=htons(port_number);

    memmove(&outgoing_address.sin_addr,
            *pointer_pointer,
            sizeof(&outgoing_address.sin_addr)
           );

    if(connect(my_socket,(struct sockaddr*)&outgoing_address,sizeof(outgoing_address)))
    {
      perror("connect()");

      return ;
    }

    printf("connection established on file descriptor %d\n",my_socket);
  }

} /* do_one() */

int
main(void)
{
  do_one("localhost",80);
  do_one("localhost",81);
  do_one("127.0.0.1",80);
  do_one("tiger",80);
  do_one("www.google.com",80);

  return 0;

} /* main() */

EOD

The output I got was this:

==========
destination         : localhost:80
host's official name: localhost
IP address          : 127.0.0.1
connection established on file descriptor 3
==========
destination         : localhost:81
host's official name: localhost
IP address          : 127.0.0.1
connect(): Connection refused
==========
destination         : 127.0.0.1:80
host's official name: 127.0.0.1
IP address          : 127.0.0.1
connection established on file descriptor 5
==========
destination         : tiger:80
host's official name: tiger.x441afea5.org
alias               : tiger
IP address          : 10.0.0.1
connection established on file descriptor 6
==========
destination         : www.google.com:80
host's official name: www.l.google.com
alias               : www.google.com
IP address          : 74.125.229.50
connection established on file descriptor 7
IP address          : 74.125.229.52
connection established on file descriptor 8
IP address          : 74.125.229.48
connection established on file descriptor 9
IP address          : 74.125.229.49
connection established on file descriptor 10
IP address          : 74.125.229.51
connection established on file descriptor 11

Hope this helps.

Share:
48,000
deadfish
Author by

deadfish

Updated on March 28, 2020

Comments

  • deadfish
    deadfish about 4 years

    i need help converting hostname to ip and inserting to sockaddr_in->sin_addr to be able assign to char. For example i input: localhost and it gives me 127.0.0.1

    I found code, but i dont know why it gives me wrong numbers

    //---
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/fcntl.h>
    #include <netdb.h>
    //---
    
    ///CZY WPISANO HOST
    
            struct in_addr inaddr;
            inaddr.s_addr = inet_addr(argv[1]);
            if( inaddr.s_addr == INADDR_NONE) //if sHost is name and not IP
            {
                struct hostent* phostent = gethostbyname( argv[1]);
                if( phostent == 0)
                    bail("gethostbyname()");
    
                if( sizeof(inaddr) != phostent->h_length)
                    bail("problem z inaddr"); // error something wrong,
    
                puts(argv[1]);
                inaddr.s_addr = *((unsigned long*) phostent->h_addr);
    
                //strdup( inet_ntoa(inaddr));
                srvr_addr = inet_ntoa(adr_srvr.sin_addr);
                puts(srvr_addr);
            }
    

    I also wrote own code but i dont know how transfer from sockaddr to sockaddr_in data:

    ///CZY WPISANO HOST
        if(argv[1][0]>=(char)'a' && argv[1][0]<=(char)'Z')
        {
            struct hostent *hent;
            hent = gethostbyname(argv[1]);
            adr_srvr.sin_addr =  (struct in_addr*)hent->h_addr_list;
    
        }
    

    adr_srvr is a char* type

    I really need help, thanks!

  • Bill Evans at Mariposa
    Bill Evans at Mariposa about 13 years
    That's actually pretty good, coming straight from memory. I couldn't do it from memory like that. One must remember the socket() call, and also to zero out the sockaddr_in struct before filling it, because there are fields which you don't want accidentally set nonzero.
  • R.. GitHub STOP HELPING ICE
    R.. GitHub STOP HELPING ICE about 13 years
    gethostbyname is deprecated and will be extremely problematic with the imminent transition to ipv6. Always use the modern getaddrinfo interface instead.
  • Athabaska Dick
    Athabaska Dick about 13 years
    Yeah thats true. I second that.
  • Bill Evans at Mariposa
    Bill Evans at Mariposa about 13 years
    I actually third that. W. Richard Stevens of happy memory says the same thing,but my answer (below) was intended not to give a turnkey solution, but to suggest an answer to "I don't know why it gives me wrong numbers".