Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Несмотря на то что дейтаграммные протоколы вроде 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
  • ...
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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