Programma сервер
// Структура передаваемого сообщения
structmessage{
char text[30];
int length;
} ;
void errorp(char *s)
{
perror(s);
exit(1);
}
void sigorg(int sig)
{
printf("2:Stop server %d\n",getpid()) ;
exit(0) ;
}
int newsockfd;
int main()
{
int sockfd ;
struct sockaddr_in server;
struct message mess;
signal(1,sigorg) ;
// семейство адресов – домен, связь через сеть
server.sin_family=AF_INET ;
server.sin_port=8000 ; // номер порта
server.sin_addr.s_addr=INADDR_ANY ; // lokale IP adress pc
// create soket
if ((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1)
errorp("2:Error socket") ;
// связывает сетевой адрес компьютера с идентификатором сокета
if (bind(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr_in))==-1)
errorp("2:Error bind") ;
// waitofklienta- включить прием соединений
if (listen(sockfd,5)==-1)
errorp("2:Error listen") ;
while(1) {
// create dopolnitelnogo soketa
if ((newsockfd=accept(sockfd,NULL,NULL))==-1)
errorp("2:Error accept") ;
// child
if (fork()==0) {
// read message
if (recv(newsockfd,&mess,sizeof(struct message),0)>0) {
mess.text[mess.length]='\0'; // formir string of message
printf("2: Read '%s'\n", mess.text);
send(newsockfd, &mess, sizeof(struct message),0); // отправить сообщение
}
close(newsockfd) ;
}
exit(0);
}
exit (0);
return 0 ;
}
Programma Client
struct message {
char name[30] ;
int length ;
} ;
void errorp(char *s)
{
perror(s) ;
exit(1) ;
}
int main()
{
int sockfd, answ ;
char c, rc, string[20] ;
struct sockaddr_in server ;
struct message mess ;
// формируем сообщение – имя сервера и длину строки
strcpy(string, "server") ;
strcpy(mess.name,string) ;
mess.length=strlen(string);
// семейство адресов – домен, связь через сеть
server.sin_family=AF_INET ;
server.sin_port=7000 ; // номер порта
server.sin_addr.s_addr=inet_addr("127.0.0.1") ; // IP адрес
// создание сокета
if ((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1)
errorp("Client: Error socket");
printf("Client: Create socket %d \n", sockfd) ;
// запрос на подключение к серверу
if (connect(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr_in))==-1)
errorp("Client:Server not found");
printf("Client: Server was found\n");
// send name to DNS server
send(sockfd, &mess, sizeof(struct message),0);
if (recv(sockfd,&mess,sizeof(struct message),0)>=0) { // message ot DNS
printf("Client: DNS Server answered\n");
if (mess.length != 0) {
printf("Client: server '%s' was found\n",string);
printf("Client: it's addres is %s\n",mess.name);
}
else
printf("Client: server '%s' not found!\n",string);
}
else
errorp("Client:Server cannot ask!");
printf("Client was ended\n") ;
exit(0);
return 0 ;
}
Тесты
Проверка правильности работы программы
$ ./ser & ./dns & ./cl
Client: Create socket 4
Client: Server was found
DNS: Server get a name of server server from client
DNS: server 'server' is found
DNS: IP=127.0.0.1
DNS: server '127.0.0.1' was found
DNS: Send message to 'server' IP=127.0.0.1
DNS: Connect with IP=127.0.0.1 ......
2: Read '127.0.0.1'
DNS: Message from 'server' IP=127.0.0.1
DNS: The end
Client: DNS Server answered
Client: server 'server' was found
Client: it's addres is 127.0.0.1
Client was ended