программирование сокетов gethostbyname () возвращает ноль (может быть причиной удаления хоста) - PullRequest
0 голосов
/ 27 июня 2018

Я проверяю открытый исходный код мессенджера, который больше не поддерживается. (Gtmess .97) (он использует sys / socket.h для программирования сокетов).

К сожалению, обнаружена функция gethostbyname (), и она возвращает ноль для адреса, который указан как имя хоста (messenger.hotmail.com), я пытался изменить код с помощью 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 () part

/* 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 голосов
/ 27 июня 2018

Имя хоста messenger.hotmail.com больше не действует.

У него есть запись CNAME для messenger.hotmail.geo.msnmessenger.msn.com.akadns.net, однако с ним не связано ни одного IP-адреса. Таким образом, вы не получите обратно никаких действительных адресов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...