首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回2.0.0.0的getaddrinfo()

返回2.0.0.0的getaddrinfo()
EN

Stack Overflow用户
提问于 2013-11-23 14:39:24
回答 2查看 1.2K关注 0票数 0

我正在试图查找主机名的IP地址,即www.google.com

我调用getaddrinfo()扫描列表,创建原始ipv4 icmp套接字,然后将套接字绑定到地址

当我检查在wireshark中发送的数据包时,无论传递给getaddrinfo()的主机名是什么,地址都会显示为2.0.0.0。

代码语言:javascript
复制
  int                  skt, errno;
   struct sockaddr_in   addr;
   struct addrinfo      hints;  //prefered addr type(connection)
   struct addrinfo  *   list;   //list of addr structs
   struct addrinfo  *   addrptr;//the one i am gonna use

   struct in_addr test;

    if(servname == NULL){
        fprintf(stderr, "No servname!\n");
        exit(1);
    }

    /*
     * prefered connection type
     */

    bzero(&hints, sizeof(hints));
    hints.ai_flags                = 0;
    hints.ai_family               = AF_INET;
    hints.ai_socktype             = SOCK_RAW;
    hints.ai_protocol             = IPPROTO_ICMP;                 

    /*get IP*/
    if((errno = getaddrinfo(servname, 0, &hints, &list))<0){
        fprintf(stderr, "addrinfo error, lookup fail:  %s",
        gai_strerror(errno));
        exit(1);
    }

   addrptr=list;
   //start scanning 
   while(addrptr){
       //start
       if((skt = socket(addrptr->ai_family, addrptr->ai_socktype, addrptr->ai_protocol))<0){
        perror("socket()");
        exit(1);
       }
           if(skt > 0)
            if(connect(skt,addrptr->ai_addr, addrptr->ai_addrlen)==0)
                break;
            printf("attempt connect\n");
            close (skt);
            addrptr=addrptr->ai_next;
    }


 //once IP has been found set destination address an port=0
 dstaddr.sin_addr.s_addr = ((struct in_addr *)addrptr->ai_addr)->s_addr;
 dstaddr.sin_port        = 0;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-23 16:30:36

代码中似乎有一些错误:

  • addrptr=list->ai_next应该是addrptr=addr->ai_next来遍历列表。
  • 在while-循环之后,addrptr->ai_addr保存最后找到的条目,而不是list->ai_addr
  • bind()在成功时返回零,所以您应该使用if(bind(...) == 0) break;检查
  • 除非我搞错了,bind()是用来将套接字绑定到本地地址的。若要检查是否可以在某个地址到达主机,请改用connect()

这是我尝试过的代码:

代码语言:javascript
复制
int main(int argc, const char * argv[])
{
    int                  skt, errno;
    struct addrinfo      hints;  //prefered addr type(connection)
    struct addrinfo  *   list;   //list of addr structs
    struct addrinfo  *   addrptr;//the one i am gonna use

    char *servname = "www.google.com";

    memset(&hints, 0, sizeof(hints));
    hints.ai_flags                = 0;
    hints.ai_family               = AF_INET;
    hints.ai_socktype             = SOCK_RAW;
    hints.ai_protocol             = IPPROTO_ICMP;

    if ((errno = getaddrinfo(servname, 0, &hints, &list))<0){
        fprintf(stderr, "addrinfo error, lookup fail:  %s", gai_strerror(errno));
        exit(1);
    }

    for (addrptr = list; addrptr != NULL; addrptr = addrptr->ai_next) {
        if ((skt = socket(addrptr->ai_family, addrptr->ai_socktype, addrptr->ai_protocol)) == -1)
            continue;
        if(connect(skt,addrptr->ai_addr, addrptr->ai_addrlen) == 0)
            break;
        close (skt);
    }

    if (addrptr != NULL) {
        char host[NI_MAXHOST];
        getnameinfo(addrptr->ai_addr, addrptr->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
        printf("%s can be reached at %s\n", servname, host);
    }

    return 0;
}

输出是:"www.google.com可达173.194.113.146“

更新:复制找到的地址的代码是错误的,它应该是

代码语言:javascript
复制
struct sockaddr_in dstaddr;
memcpy(&dstaddr, addrptr->ai_addr, sizeof(dstaddr));
dstaddr.sin_port        = 0;
票数 0
EN

Stack Overflow用户

发布于 2019-01-24 00:46:10

为了澄清,这种情况发生在铸造时。

代码语言:javascript
复制
struct sockaddr_in dest;
struct addrinfo* ainfo_arr;

/*getaddrinfo(hostname,NULL,&hints,&ainfo_arr);*/

dest = *( (struct sockaddr_in*) ainfo_arr);
//casting addrinfo to sockaddr_in

而不是

代码语言:javascript
复制
struct sockaddr_in dest;
struct addrinfo* ainfo_arr;

/*getaddrinfo(hostname,NULL,&hints,&ainfo_arr);*/

dest = *( (struct sockaddr_in*) ainfo_arr->ai_addr);
//casting sockaddr to sockaddr_in

因此,dest中的数据无效。

(可能是AF_PACKET https://stackoverflow.com/a/40254078/6569209)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20163640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档