Вход/Регистрация
Операционная система UNIX
вернуться

Робачевский Андрей Михайлович

Шрифт:

 fprintf(stderr, "Сервер готов: %s\n",

inet_ntoa(serv_addr.sin_addr));

 /* Сервер готов принимать запросы

на установление соединения.

Максимальное число запросов, ожидающих обработки – 5.

Как правило, этого числа достаточно, чтобы успеть

выполнить accept(2) и породить дочерний процесс */

 if (listen(s, 5)==-1) {

perror("Ошибка вызова listen");

exit(1);

 }

 /* Бесконечный цикл получения запросов и их обработки */

 while (1) {

int addrlen;

bzero(&clnt_addr, sizeof(clnt_addr));

addrlen = sizeof(clnt_addr);

/* Примем запрос. Новый сокет ns становится

коммуникационным узлом созданного виртуального канала */

if ((ns=accept(s, (struct sockaddr*)&clnt_addr,

&addrlen))==-1) {

perror("Ошибка вызова accept");

exit(1);

}

/* Выведем информацию о клиенте */

fprintf(stderr, "Клиент = %s\n",

inet_ntoa(clnt_addr.sin_addr));

/* Создадим процесс для работы с клиентом */

if ((pid=fork)==-1) {

perror("Ошибка вызова fork");

exit(1);

}

if (pid==0) {

int nbytes;

int fout;

/* Дочерний процесс: этот сокет нам не нужен. Он

по-прежнему используется для получения запросов */

close(s);

/* Получим сообщение от клиента и передадим его обратно */

while ((nbytes = recv(ns, buf, sizeof(buf), 0)) !=0) {

send(ns, buf, sizeof(buf), 0);

}

close(ns);

exit(0);

}

/* Родительский процесс: этот сокет нам не нужен. Он

используется дочерним процессом для обмена данными */

close(ns);

 }

}

Клиент

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <fcntl.h>

#include <netdb.h>

/* Номер порта, который обслуживается сервером */

#define PORTNUM 1500

main (argc, argv)

char *argv[];

int argc;

{

 int s;

 int pid;

 int i, j;

 struct sockaddr_in serv_addr;

 struct hostent *hp;

 char buf[80]="Hello, World!";

 /* В качестве аргумента клиенту передается доменное имя

хоста, на котором запущен сервер. Произведем трансляцию

доменного имени в адрес */

 if ((hp = gethostbyname(argv[1])) == 0) {

perror("Ошибка вызова gethostbyname");

exit(3);

 }

 bzero(&serv_addr, sizeof(serv_addr));

 bcopy(hp->h_addr, &serv_addr.sin_addr, hp->h_length);

 serv_addr.sin_family = hp->h_addrtype;

 serv_addr.sin_port = htons(PORTNUM);

 /* Создадим сокет */

  • Читать дальше
  • 1
  • ...
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: