Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab8+.doc
Скачиваний:
22
Добавлен:
27.03.2015
Размер:
113.66 Кб
Скачать

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 ;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]