Programma dns
// Структура передаваемого сообщения
struct message {
char text[30];
int length;
} ;
void errorp(char *s)
{
perror(s);
exit(1);
}
void sigorg(int sig) //Процедура обработки сигнала
{
printf("DNS: %d stoped\n", getpid()) ;
exit(0) ;
}
int newsockfd ;
int main()
{
int sockfd, sockfd2, flag=0, answ ;
char c, srvname[40], srvip[20] ;
struct sockaddr_in server, server2 ;
static struct message mess,mess2 ;
FILE *in;
// client
server.sin_family=AF_INET ;
server.sin_port=7000 ;
server.sin_addr.s_addr=INADDR_ANY ;
// server 2
server2.sin_family=AF_INET ;
server2.sin_port=8000 ;
signal(1,sigorg) ;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
errorp("DNS:Error socket");
// connect s soketom
if(bind(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr_in))==-1)
errorp("DNS:Error bind") ;
// wait obrachenie
if(listen(sockfd,5)==-1)
errorp("DNS:Error listen") ;
// if is zapros create dopolnitel soket
if((newsockfd=accept(sockfd,NULL,NULL))==-1)
errorp("DNS:Error accept") ;
// child
if (fork()==0) {
// получение сообщения – имени сервера, от клиента
if (recv(newsockfd,&mess,sizeof(struct message),0)>0) {
mess.text[mess.length]='\0' ;
printf("DNS: Server get a name of server %s from client\n", mess.text);
// find name server in file dns.url
if ((in=fopen("dns.url", "r")) == NULL)
errorp("DNS: Error open file") ;
while (!feof(in) && flag==0) {
fscanf(in, "%s", &srvname) ; // читаем имя сервера
fscanf(in, "%s", &srvip); // читаем IP adress
if (strcmp(srvname, mess.text)==0) { // если нашли
printf("DNS: server '%s' is found\n", srvname) ;
printf("DNS: IP=%s\n",srvip);
flag=1;
}
}
fclose(in) ;
// если имя сервера было найдено в файле
if (flag==1){
printf("DNS: server '%s' was found\n", srvip);
strcpy(mess.text,srvip); // найденное имя
mess.length=strlen(srvip);
// send to server message – name of server
printf("DNS: Send message to '%s' IP=%s\n",srvname,srvip);
// преобразование текста в IP адрес – в структуру типа in_addr
server2.sin_addr.s_addr=inet_addr(srvip);
strcpy(mess2.text, mess.text) ; // copy mess in mess2
mess2.length=strlen(mess.text);
// создание сокета для работы с сервером
if ((sockfd2=socket(AF_INET,SOCK_STREAM,0))==-1)
errorp("DNS: Error socket");
// запрос на подсоединение к серверу
if (connect(sockfd2,(struct sockaddr*)&server2,sizeof(struct sockaddr_in))==-1)
errorp("DNS:Error connect");
printf("DNS: Connect with IP=%s ......\n",srvip);
// отправить сообщение серверу
send(sockfd2,&mess2,sizeof(struct message),0);
// получить ответ от сервера
if (recv(sockfd2,&mess2,sizeof(struct message),0)>0)
printf("DNS: Message from '%s' IP=%s\n",srvname,srvip);
else
errorp("DNS: Error receive from IP");
}
// если имя сервера не было найдено в файле
else {
printf("DNS: server '%s' not found\n", mess.text);
if ((in = fopen("dns.url", "r")) == NULL)
errorp("DNS:Error open file");
flag=0;
// подключиться последовательно ко всем серверам в файле
while (!feof(in) && flag==0) {
fscanf(in,"%s",&srvname); // computer name
fscanf(in,"%s",&srvip); // computer number
printf("DNS: Send message to '%s' IP=%s\n",srvname,srvip);
server2.sin_addr.s_addr=inet_addr(srvip); // text IP to struct
strcpy(mess2.text, mess.text) ; // mess in mess2
mess2.length=strlen(mess.text);
if ((sockfd2=socket(AF_INET,SOCK_STREAM,0))==-1)
errorp("DNS: Error socket");
if (connect(sockfd2,(struct sockaddr*)&server2,sizeof(struct sockaddr_in))==-1)
errorp("DNS:Error connect");
printf("DNS: Connect with IP=%s ......\n",srvip);
send(sockfd2,&mess2,sizeof(struct message),0);
if (recv(sockfd2,&mess2,sizeof(struct message),0)>0)
printf("DNS: Message from '%s' IP=%s\n",srvname,srvip);
else
errorp("DNS: Error receive from IP");
}
strcpy(mess.text,"") ; // not found
mess.length=0 ;
}
// answer to client
send(newsockfd,&mess,sizeof(struct message),0); //Возвращаем ответ клиенту
printf("DNS: The end\n");
}
}
exit(0);
return 0 ;
}