Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Клиент не выполняет связывания, поскольку ему безразлично, какой адрес будет иметь его коммуникационный узел. Эту операцию выполняет система, выбирая свободный адрес порта и установленный адрес хоста. Далее клиент направляет запрос на установление соединения (connect(2)), указывая адрес сервера (IP-адрес и номер порта). После установления соединения ("тройное рукопожатие") клиент передает сообщение (send(2)), принимает от сервера ответ recv(2)) и выводит его на экран.

В программе используются несколько функций, которые не рассматривались.

Эти функции значительно облегчают жизнь программисту, выполняя, например, такие действия, как трансляцию доменного имени хоста в его IP-адрес (gethostbyname(3N)), приведение в соответствие порядка следования байтов в структурах данных, который может различаться для хоста и сети (htons(3N)), а также преобразование IP-адресов и их составных частей в соответствии с привычной "человеческой" нотацией, например 127.0.0.1 (inet_ntoa(3N)). Мы не будем подробнее останавливаться на этих функциях, предоставляя читателю самостоятельно обратиться к соответствующим разделам электронного справочника man(1).

Ниже приведены тексты программ сервера и клиента.

Сервер

#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)

int argc;

char *argv[];

{

 int s, ns;

 int pid;

 int nport;

 struct sockaddr_in serv_addr, clnt_addr;

 struct hostent* hp;

 char buf[80], hname[80];

 /* Преобразуем порядок следования байтов

к сетевому формату */

 nport = PORTNUM;

 nport = htons((u_short)nport);

 /* Создадим сокет, использующий протокол TCP */

 if ((s=socket(AF_INET, SOCK_STREAM, 0))==-1) {

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

exit(1);

 }

 /* Зададим адрес коммуникационного узла */

 bzero(&serv_addr, sizeof(serv_addr));

 serv_addr.sin_family = AF_INET;

 serv_addr.sin_addr.s_addr = INADDR_ANY;

 serv.addr.sin_port = nport;

 /*
Свяжем сокет с этим адресом */

 if (bind(s, struct sockaddr*)&serv_addr,

sizeof(serv_addr))==-1) {

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

exit(1);

 }

 /* Выведем сообщение с указанием адреса сервера */

 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) {

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

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21

Книга пяти колец. Том 4

Зайцев Константин
4. Книга пяти колец
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Книга пяти колец. Том 4

Не отпускаю

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
8.44
рейтинг книги
Не отпускаю

Брак по-драконьи

Ардова Алиса
Фантастика:
фэнтези
8.60
рейтинг книги
Брак по-драконьи

Князь

Мазин Александр Владимирович
3. Варяг
Фантастика:
альтернативная история
9.15
рейтинг книги
Князь

Столичный доктор

Вязовский Алексей
1. Столичный доктор
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Столичный доктор

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Темный Охотник 2

Розальев Андрей
2. Темный охотник
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Темный Охотник 2

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Перерождение

Жгулёв Пётр Николаевич
9. Real-Rpg
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Перерождение

Право налево

Зика Натаэль
Любовные романы:
современные любовные романы
8.38
рейтинг книги
Право налево

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7