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

标签 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;

}

最佳答案

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

它确实有messenger.hotmail.geo.msnmessenger.msn.com.akadns.net 的CNAME 记录,但没有与其关联的IP 地址。因此您将不会得到任何有效地址。

关于c - 套接字编程 gethostbyname() 返回 null (可能是主机删除的原因),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51065151/

相关文章:

python - Cython:在结构中嵌套 union

c - 为什么要用一个整数来存储4个字符?有什么实际好处吗?

c - 如何复制 "casted"字符串中的字符?

java - 缓冲区读取器意外行为

java - 获取传入连接的域名

c - UDP 客户端和服务器无法跨不同机器进行通信

c - 使用具有各种跟踪级别的宏

c++ - 对 pthreads 感到困惑

c - 通过 TCP 发送一个 int 数组时,为什么只有第一个数量是正确的?

java - 无法从输出流读取