我正在检查不再支持的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/