【问题标题】:converting host to ip by sockaddr_in gethostname etc通过 sockaddr_in gethostname 等将主机转换为 ip
【发布时间】:2011-07-23 14:03:33
【问题描述】:

我需要帮助将主机名转换为 ip 并插入到 sockaddr_in->sin_addr 以便能够分配给 char。 例如我输入: localhost 它给了我 127.0.0.1

我找到了代码,但我不知道为什么它给了我错误的数字

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

我也写了自己的代码,但我不知道如何从 sockaddr 转移到 sockaddr_in 数据:

///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 是 char* 类型

我真的需要帮助,谢谢!

【问题讨论】:

    标签: c ip host


    【解决方案1】:

    试试这样的:

      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 */
      }
    

    我直接根据记忆编写了这段代码,所以我不能保证它可以工作,但我很确定它应该没问题。

    【讨论】:

    • 这实际上非常好,直接来自记忆。我不能像那样凭记忆做到这一点。必须记住 socket() 调用,并在填充 sockaddr_in 结构之前将其清零,因为有些字段您不希望意外设置为非零。
    • gethostbyname 已被弃用,并且在即将过渡到 ipv6 时会出现严重问题。 始终改用现代的getaddrinfo 界面。
    • 是的,这是真的。我同意这一点。
    • 我实际上是第三个。幸福记忆的 W. Richard Stevens 也说了同样的话,但我的回答(如下)不是为了给出一个交钥匙解决方案,而是建议一个回答“我不知道为什么它给了我错误的数字”。
    【解决方案2】:

    这个 shell 脚本编译正确的 C 代码,我相信它会做你想做的事:

    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
    

    我得到的输出是这样的:

    ==========
    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
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 2011-07-31
      • 2012-05-20
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多