我正在检查不再受支持的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;
}
答案 0 :(得分:1)
主机名messenger.hotmail.com不再有效。
它确实具有messenger.hotmail.geo.msnmessenger.msn.com.akadns.net的CNAME记录,但是没有与之关联的IP地址。这样您就不会找回任何有效地址。