Я проверяю открытый исходный код мессенджера, который больше не поддерживается. (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;
}