套接字编程gethostbyname()返回null(可能是主机删除的原因)

时间:2018-06-27 14:17:03

标签: c sockets

我正在检查不再受支持的Messenger的开源代码。(gtmess .97)(它使用sys / socket.h进行套接字编程)。

不幸的是遇到了gethostbyname()函数,它为主机名(messenger.hotmail.com)给出的地址返回null,我试图使用getaddrinfo()更改代码,但即使getaddrinfo()都说没有这样的服务器

问题是,有没有办法解决它?(也请考虑我是套接字编程的初学者)

代码如下:(注释部分是源代码中写的内容,未注释部分是我试图使用另一种方法进行模拟的部分):

/* connect a client socket to a server and return a socket descriptor */
int ConnectToServer(char *addr, int defport)
{  
    /*
    int sfd;
    struct sockaddr_in servaddr;
    struct hostent *host;
    char hostname[256];
    int port;
    int err;

    ParseAddr(hostname, &port, defport, addr);


    if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        return -1;

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(port);
    host = gethostbyname(hostname);
    if (host == NULL) {
        err = errno;
        close(sfd);
        errno = err;
        return -2;
    }

    servaddr.sin_addr.s_addr =  *((int *) host->h_addr_list[0]);

    if (connect(sfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) {
        err = errno;
        close(sfd);
        errno =err;
        return -3;
    }

    return sfd;
    */




    struct addrinfo hints, *res , *p;
    int sockfd;
    int err;

    memset(&hints,0,sizeof hints);
    hints.ai_family=AF_UNSPEC;
    hints.ai_socktype=SOCK_STREAM;

    getaddrinfo("messenger.hotmail.com","1863",&hints,&res);

    if((sockfd=socket(res->ai_family,res->ai_socktype,res->ai_protocol))<0)
        return -1;

    if(connect(sockfd,res->ai_addr,res->ai_addrlen)){
        err = errno;
        close(sockfd);
        errno =err;
        return -3;
    }

    return sockfd;
}

编辑: 我更改了服务器并进行了循环以进行连接,但似乎新服务器也出现了问题,该问题使send()部分中的对等方重置了连接

/* connect a client socket to a server and return a socket descriptor */
int ConnectToServer(char *addr, int defport)
{   
    struct addrinfo hints, *res , *p;
    int sockfd;
    int err;
    int rv;

    memset(&hints,0,sizeof hints);
    hints.ai_family=AF_UNSPEC;
    hints.ai_socktype=SOCK_STREAM;

    if(rv=getaddrinfo("messenger.hotmail.geo.msnmessenger.msn.com.akadns.net","1863",&hints,&res)!=0){
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
    return 1;
    };
    for(p=res;p!=NULL;p=p->ai_next){
        if((sockfd=socket(p->ai_family,p->ai_socktype,p->ai_protocol))<0){
            continue;
        }

        if(connect(sockfd,p->ai_addr,p->ai_addrlen)){
            err = errno;
            close(sockfd);
            errno =err;
            continue;
        }
        break;
    }

    if(p==NULL)
        return -3;

    return sockfd;

}

1 个答案:

答案 0 :(得分:1)

主机名messenger.hotmail.com不再有效。

它确实具有messenger.hotmail.geo.msnmessenger.msn.com.akadns.net的CNAME记录,但是没有与之关联的IP地址。这样您就不会找回任何有效地址。