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

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

Жанры

Основы программирования в Linux
Шрифт:

char from server = В

serving client on fd 5

server waiting

removing client on fd 4

char from server = В

serving client on fd 6

server waiting

removing client on fd 5

server waiting

char from server = В

removing client on fd 6

server waiting

[2] Done ./client3

[3]- Done ./client3

[4]+ Done ./client3

Для

полноты аналогии, упомянутой в начале главы, в табл. 15.5 приведены параллели между соединениями на базе сокетов и телефонными переговорами.

Таблица 15.5

Телефон Сетевые сокеты
Звонок в компанию по номеру 555-0828 Подключение к IP-адресу 127.0.0.1
Ответ на звонок секретаря приемной Установка соединения с
remote host
Просьба соединить с финансовым отделом. Маршрутизация с помощью заданного порта (9734)
Ответ на звонок администратора финансового отдела Вызов
select
вернул управление серверу
Звонок переадресован свободному менеджеру по работе с корпоративными заказчиками Сервер вызывает
accept
, создавая новый сокет на добавочный номер 456

Дейтаграммы

В этой главе мы сосредоточились на программировании приложений, поддерживающих связь со своими клиентами с помощью TCP-соединений на базе сокетов. Существуют ситуации, в которых затраты на установку и поддержку соединения с помощью сокетов излишни.

Хорошим примером может служить сервис

daytime
, использованный ранее в программе getdate.c. Вы создаете сокет, выполняете соединение, читаете единственный ответ и разрываете соединение. Столько операций для простого получения даты!

Сервис

daytime
так же доступен с помощью UDP-соединений, применяющих дейтаграммы. Для того чтобы воспользоваться им, просто пошлите сервису одну дейтаграмму и получите в ответ единственную дейтаграмму, содержащую дату и время. Все просто.

Сервисы, предоставляемые по UDP-протоколу, применяются в тех случаях, когда клиенту нужно создать короткий запрос к серверу, и он ожидает единственный короткий ответ. Если стоимость времени процессора достаточно низкая, сервер способен обеспечить такой сервис, обрабатывая запросы клиентов по одному и разрешая операционной системе хранить очередь входящих запросов. Такой подход упрощает программирование сервера.

Поскольку UDP — не дающий гарантий сервис, вы можете столкнуться с потерей вашей дейтаграммы или ответа сервера. Если данные важны для вас, возможно, придется тщательно программировать ваших UDP-клиентов, проверяя ошибки и при необходимости повторяя попытки. На практике в локальных сетях UDP-дейтаграммы очень надежны.

Для доступа к сервису, обеспечиваемому UDP-протоколом, вам следует применять системные вызовы

socket
и
close
, но вместо использования вызовов
read
и
write
для сокета вы применяете два системных вызова, характерных для дейтаграмм:
sendto
и
recvfrom
.

Далее приведена модифицированная версия программы getdate.c, которая получает дату с помощью сервиса UDP-дейтаграмм. Изменения по сравнению с предыдущей версией выделены цветом.

/* Начните с обычных include и объявлений. */

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

int main(int argc, char *argv[]) {

 char *host;

 int sockfd;

 int len, result;

 struct sockaddr_in address;

 struct hostent *hostinfo;

 struct servent *servinfo;

 char buffer[128];

 if (argc == 1) host = "localhost";

 else host = argv[1];

 /* Ищет адрес хоста и сообщает об ошибке, если не находит. */

 hostinfo = gethostbyname(host);

 if (!hostinfo) {

fprintf(stderr, "no host: %s\n", host);

exit(1);

 }

 /* Проверяет наличие на компьютере сервиса daytime. */

 servinfo = getservbyname("daytime", "udp");

 if (!servinfo) {

fprintf(stderr, "no daytime service\n");

exit(1);

 }

 printf("daytime port is %d\n", ntohs(servinfo->s_port));

 /* Создает UDP-сокет. */

 sockfd = socket(AF_INEТ, SOCK_DGRAM, 0); 

 /* Формирует адрес для использования в вызовах sendto/recvfrom... */

 address.sin_family = AF_INET;

 address.sin_port = servinfo->s_port;

 address.sin_addr = *(struct in_addr*)*hostinfo->h_addr_list;

 len = sizeof(address);

 result = sendto(sockfd, buffer, 1, 0, (struct sockaddr *)&address, len);

 result = recvfrom(sockfd, buffer, sizeof(buffer), 0,

(struct sockaddr *)&address, &len);

 buffer [result] = '\0';

 printf("read %d bytes: %s", result, buffer);

 close(sockfd);

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

Корона Тафелона

Авербух Наталья Владимировна
3. Ведьмина дорога
Фантастика:
фэнтези
5.00
рейтинг книги
Корона Тафелона

Некромант . Трилогия

Петерсон Андрей Викторович
Перстень некромансера
Фантастика:
фэнтези
7.64
рейтинг книги
Некромант . Трилогия

Будаг — мой современник

Велиев Али Кара оглы
Проза:
советская классическая проза
5.00
рейтинг книги
Будаг — мой современник

Искатель, 2011 №5

Юдин Александр Валентинович
388. Искатель
Приключения:
прочие приключения
5.00
рейтинг книги
Искатель, 2011 №5

Собрание сочинений. Том 45

Энгельс Фридрих
Научно-образовательная:
философия
5.00
рейтинг книги
Собрание сочинений. Том 45

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Ермак. Регент

Сёгун

Клавелл Джеймс
Азиатская сага
Приключения:
исторические приключения
прочие приключения
9.41
рейтинг книги
Сёгун

Тот, кто знает. Книга вторая. Перекресток

Маринина Александра
1. Преступления правильной жизни
Детективы:
прочие детективы
7.91
рейтинг книги
Тот, кто знает. Книга вторая. Перекресток

3ds Max 2008. Секреты мастерства

Верстак Владимир
Компьютеры и Интернет:
программное обеспечение
5.00
рейтинг книги
3ds Max 2008. Секреты мастерства

Справедливость для всех

Николаев Игорь Игоревич
6. Ойкумена
Фантастика:
эпическая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Справедливость для всех

Разбуди в себе исполина

Роббинс Энтони
Научно-образовательная:
психология
5.00
рейтинг книги
Разбуди в себе исполина

1001 заговор сибирской целительницы / Наталья Ивановна Степанова

Степанова Наталья Ивановна
Дом и Семья:
прочее домоводство
7.86
рейтинг книги
1001 заговор сибирской целительницы / Наталья Ивановна Степанова

Кровь, слезы и лавры

Пикуль Валентин Саввич
Исторические миниатюры
Проза:
историческая проза
5.00
рейтинг книги
Кровь, слезы и лавры

Последний реанорец. Том V

Павлов Вел
4. Высшая Речь
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Последний реанорец. Том V