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

на главную

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

• Говорят, что протоколы обеспечивают упорядочение, если они гарантируют доставку данных в том же порядке, в котором они были отправлены.

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

• Потоковые протоколы распознают только байтовые границы. Последовательности байтов могут разделяться и доставляться адресату по мере появления данных.

• Пакетные протоколы обрабатывают пакеты данных, сохраняя границы пакета и доставляя полные пакеты получателям. Пакетные протоколы, как правило, требуют определенного максимального размера пакета.

Хотя

каждый из перечисленных атрибутов не зависит от остальных, в приложениях употребляются только два основных типа протоколов. Дейтаграммные протоколы являются механизмами пакетной передачи, не предоставляя при этом ни упорядочения, ни защиты от ошибок. Широко используется дейтаграммный протокол UDP, являющийся представителем семейства протоколов TCP/IP. Потоковые протоколы (такие как TCP из TCP/IP) — это протоколы потоковой передачи, которые обеспечивают и упорядочение, и защиту от ошибок.

Несмотря на то что дейтаграммные протоколы вроде UDP, несомненно, полезны [118] , мы остановимся на применении потоковых протоколов, поскольку их легче использовать для большинства приложений. Подробное описание разработки протоколов и различий между их отдельными видами можно найти во многих книгах, например, [33] и [34].

17.1.4. Адреса

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

struct sockaddr
; его содержимое устанавливается по-разному для каждого семейства адресов. Передавая
struct sockaddr
в системный вызов, процесс также указывает размер передаваемого адреса. Тип
socklen_t
определяется как число, достаточно большое для хранения размера любого сокета, который используется системой.

118

Многие высокоуровневые протоколы, такие как BOOTP и NFS, построены на основе UDP.

Все типы

struct sockaddr
соответствуют приведенному ниже определению.

#include <sys/socket.h>

struct sockaddr {

 unsigned short sa_family;

 char sa_data[MAXSOCKADDRDATA];

}

Первые два байта (размер

short
) указывают семейство адресов, к которому относится данный адрес. Перечень стандартных адресных семейств, используемых приложениями Linux, приведен в табл. 17.1.

Таблица 17.1. Семейства протоколов и адресов

Адрес Протокол Описание протокола
AF_UNIX
PF_UNIX
Домен Unix.
AF_INET
PF_INET
TCP/IP (версия 4).
AF_INET6
PF_INET6
TCP/IP (версия 6).
AF_AX25
PF_AX25
AX.25, используется радиолюбителями.
AF_IPX
PF_IPX
Novell IPX.
AF_APPLETALK
PF_APPLETALK
AppleTalk DDS.
AF_NETROM
PF_NETROM
NetROM,
используется радиолюбителями.

17.2. Служебные функции

Во всех примерах этого раздела используются две функции:

copyData
и
die
. Функция
copyData
считывает данные из одного файлового дескриптора и записывает их в какой-то другой дескриптор (до тех пор, пока имеются данные для чтения). Функция
die
вызывает
perror
и завершает программу. Мы ввели обе указанные функции в файл
sockutil.с
для того, чтобы сделать обучающие программы немного проще. Для справки ниже показана реализация двух данных функций.

 1: /* sockutil.с */

 2:

 3: #include <stdio.h>

 4: #include <stdlib.h>

 5: #include <unistd.h>

 6:

 7: #include "sockutil.h"

 8:

 9: /* выдает сообщение об ошибке через функцию perror и прекращает работу программы */

10: void die(char * message) {

11: perror(message);

12: exit(1);

13: }

14:

15: /* Копирует данные из дескриптора файла 'from' в дескриптор файла

16: 'to' до полного завершения копирования. Выходит из программы, если

17: происходит ошибка. Предполагается, что для обоих файлов установлено

18: блокирующее чтение и запись. */

19: void copyData(int from, int to) {

20: char buf[1024];

21: int amount;

22:

23; while ((amount = read(from, buf, sizeof(buf))) > 0) {

24: if (write(to, buf, amount) != amount) {

25: die("write");

26: return;

27: }

28: }

29: if (amount < 0)

30: die("read");

31: }

17.3. Основные действия с сокетами

Подобно большинству остальных ресурсов Linux сокеты реализуются через файловую абстракцию. Они создаются при помощи системного вызова

socket
, который возвращает файловый дескриптор. После соответствующей инициализации сокета данный дескриптор может использоваться для запросов
read
и
write
, как и любой другой файловый дескриптор. Когда процесс завершает работу с сокетом, его необходимо закрыть через функцию
close
для того, чтобы освободить все ресурсы, ассоциированные с ним.

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

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

Все ведьмы – стервы, или Ректору больше (не) наливать

Цвик Катерина Александровна
1. Все ведьмы - стервы
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Все ведьмы – стервы, или Ректору больше (не) наливать

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Proxy bellum

Ланцов Михаил Алексеевич
5. Фрунзе
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Proxy bellum

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Законы Рода. Том 2

Flow Ascold
2. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 2

Имя нам Легион. Том 1

Дорничев Дмитрий
1. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 1

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Повелитель механического легиона. Том I

Лисицин Евгений
1. Повелитель механического легиона
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том I

Как я строил магическую империю

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

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

На изломе чувств

Юнина Наталья
Любовные романы:
современные любовные романы
6.83
рейтинг книги
На изломе чувств