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

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

Жанры

Шрифт:

 const struct sockaddr* toaddr, int tolen);

int recv(int s, char *buf, int len, int flags);

int recvfrom(int s, char *buf, int len, int flags,

 struct sockaddr* fromaddr, int* fromlen);

Функции send(2) и sendto(2) используются для передачи данных удаленному узлу, а функции recv(2) и recvfrom(2) — для их приема. Основным различием между ними является то, что функции send(2)

и recv(2) могут быть использованы только для "подсоединенного" сокета, т.е. после вызова connect(2).

Все эти вызовы используют в качестве первого аргумента дескриптор сокета, через который производится обмен данными. Аргумент

msg
содержит сообщение длиной
len
, которое должно быть передано по адресу
toaddr
, длина которого составляет
tolen
байтов. Для функции send(2) используется адрес получателя, установленный предшествовавшим вызовом connect(2). Аргумент
buf
представляет собой буфер, в который копируются полученные данные.

Параметр

flags
может принимать следующие значения:

MSG_OOB
Передать или принять экстренные данные вместо обычных
MSG_PEEK
Просмотреть данные, не удаляя их из системного буфера (последующие операции чтения получат те же данные)

Пример использования сокетов

В заключение приведем пример использования сокетов для организации межпроцессного взаимодействия. Поскольку в данном разделе не затрагиваются сетевые вопросы, то и сокеты, которые будут использованы в примере, принадлежат домену UNIX. Как и в предыдущих примерах, функциональность нашей распределенной системы не отличается разнообразием: клиент посылает серверу сообщение "Здравствуй, Мир!", а сервер отправляет его обратно клиенту, который после получения выводит сообщение на экран.

В примере использованы сокеты датаграмм, которые в домене UNIX практически не отличаются от сокетов потока. В качестве адреса сервера предлагается имя файла ./echo.server (мы полагаем, что в системе запущен только один сервер из данного каталога). Предполагается, что клиенты заранее знают этот адрес. Сервер связывает созданный сокет с этим локальным адресом и таким образом регистрируется в системе. Начиная с этого момента он готов к получению и обработке сообщений. Сервер начинает бесконечный цикл, ожидая сообщений от клиентов, блокируясь на вызове recvfrom(2). При получении сообщения сервер отправляет его обратно, вызывая sendto(2).

Сервер:

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#define MAXBUF 256 char

buf[MAXBUF];

main {

 struct sockaddr_un serv_addr, clnt_addr;

 int sockfd;

 int saddrlen, caddrlen, max caddrlen, n;

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

 if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0} {

printf("Невозможно создать сокет\n");

exit(1);

 }

 /* Свяжем сокет с известным локальным адресом. Поскольку адрес

в домене UNIX представляет собой имя файла, который будет

создан системным вызовом bind(2), сначала удалим файл с этим

именем в случае, если он сохранился от предыдущего запуска

сервера */

 unlink("./echo_server");

 bzero(&serv_addr, sizeof(serv_addr));

 serv_addr.sun_family = AF_UNIX;

 strcpy(serv_addr.sun_path, "./echo.server");

 saddrlen =

sizeof(serv_addr.sun_family) + strlen(serv_addr.sun_path);

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

saddrlen) < 0) {

printf("Ошибка связывания сокета с адресом\n");

exit(1);

 }

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

клиентов и отправления их обратно */

 max_caddrlen = sizeof(clnt_addr);

 for(;;) {

caddrlen = max_caddrlen;

n = recvfrom(sockfd, buf, MAXBUF, 0,

(struct sockaddr*)&clnt_addr, &caddrlen);

if (n < 0) {

printf("Ошибка приема\n");

exit(1);

}

/* Благодаря вызову recvfrom(2), мы знаем адрес клиента,

от которого получено сообщение. Используем этот адрес

для передачи сообщения обратно отправителю */

if (sendto(sockfd, buf, n, 0,

(struct sockaddr*)&clnt_addr, caddrlen) != n) {

printf("Ошибка передачи\n");

exit(1);

}

 }

}

Клиент создает сокет датаграмм и связывает его со своим уникальным адресом. Уникальность адреса определяется уникальностью имени файла. Поскольку одновременно могут работать несколько клиентов, возникает задача выполнения условия уникальности. Для этого мы используем функцию mktemp(3C), позволяющую по заданному шаблону /tmp/clnt.XXXX и на основании идентификатора текущего процесса получить уникальное имя, заменяя соответствующим образом символы 'X'. Связывание сокета позволяет при отправлении сообщения неявно указать его "адрес отправителя", так что серверу не составляет труда отправить сообщение обратно.

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

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5