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

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

Жанры

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

 

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

 

SOCK_DGRAM
— дейтаграммный сервис. Вы можете использовать такой сокет для отправки сообщений с фиксированным (обычно небольшим) максимальным объемом, но при этом нет гарантии, что сообщение будет доставлено или что сообщения не будут переупорядочены в сети. В случае сокетов домена
AF_INET
этот тип передачи данных обеспечивается дейтаграммами UDP (User Datagram Protocol, пользовательский протокол дейтаграмм).

Протокол, применяемый для обмена данными, обычно определяется типом сокета и доменом. Как правило, выбора нет. Параметр

protocol
применяется в тех случаях, когда выбор все же предоставляется. Задание 0 позволяет выбрать стандартный протокол, используемый во всех примерах данной главы.

Системный вызов

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

Адреса сокетов

Каждый домен сокетов требует своего формата адресов. В домене

AF_UNIX
адрес описывается структурой
sockaddr_un
, объявленной в заголовочном файле sys/un.h: 

struct sockaddr_un {

 sa_family_t sun_family; /* AF_UNIX */

 char sun_path[]; /* Путь к файлу */

};

Для того чтобы адреса разных типов могли передаваться в системные вызовы для обработки сокетов, все адресные форматы описываются похожей структурой, которая начинается с поля (в данном случае

sun_family
), задающего тип адреса (домен сокета). В домене
AF_UNIX
адрес задается именем файла в поле структуры
sun_path
.

В современных системах Linux тип

sa_family_t
, описанный в стандарте X/Open как объявляемый в заголовочном файле sys/un.h, интерпретируется как тип
short
. Кроме того, размер
pathname
, задаваемого в поле
sun_path
, ограничен (в Linux указывается 108 символов; в других системах может применяться именованная константа, например,
UNIX_MAX_PATH
). Поскольку размер адресной структуры может меняться, многие системные вызовы сокетов требуют или предоставляют на выходе длину, которая будет использоваться для копирования конкретной адресной структуры.

В домене

AF_INET
адрес задается с помощью структуры с именем
sockaddr_in
, определенной в файле netinet/in.h, которая содержит как минимум следующие элементы:

struct sockaddr_in {

 short int sin_family; /* AF_INET */

 unsigned short int sin_port; /* Номер порта */

 struct in_addr sin_addr; /* Интернет-адрес */

};

Структура IP-адреса типа in_addr определена следующим образом:

struct in_addr {

 unsigned long int s_addr;

};

Четыре байта IP-адреса образуют одно 32-разрядное значение. Сокет домена

AF_INET
полностью описывается IP-адресом и номером порта. С точки зрения приложения все сокеты действуют как файловые дескрипторы, и их адреса задаются уникальными целочисленными значениями.

Именование сокета

Для того чтобы сделать сокет (созданный с помощью вызова

socket
) доступным для других процессов, серверная программа должна присвоить сокету имя. Сокеты домена
AF_UNIX
связаны с полным именем файла в файловой системе, как вы видели в программе-примере server1. Сокеты домена
AF_INET
связаны с номером IP-порта.

#include <sys/socket.h>

int bind(int socket, const struct sockaddr *address, size_t address len);

Системный вызов

bind
присваивает адрес, заданный в параметре
address
, неименованному сокету, связанному с дескриптором сокета
socket
. Длина адресной структуры передается в параметре
address_len
:

Длина и формат адреса зависят от адресного семейства. В системном вызове

bind
указатель конкретной адресной структуры должен быть приведен к обобщенному адресному типу
(struct sockaddr*)
.

В случае успешного завершения

bind
возвращает 0. Если он завершается аварийно, возвращается -1, и переменной
errno
присваивается одно из значений, перечисленных в табл. 15.2.

Таблица 15.2

Значение
errno
Описание
EBADF
Неверный файловый дескриптор
ENOTSOCK
Файловый дескриптор не ссылается на сокет
EINVAL
Файловый дескриптор ссылается на сокет, уже получивший имя
EADDRNOTAVAIL
Недопустимый адрес
EADDINUSE
У адреса уже есть связанный с ним сокет
Для сокетов домена
AF_UNIX
есть несколько дополнительных значений
EACCESS
Невозможно создать имя в файловой системе из-за прав доступа
ENOTDIR
,
ENAMETOOLONG
Означает недопустимое имя файла
Поделиться:
Популярные книги

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Казачий князь

Трофимов Ерофей
5. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Казачий князь

Любимая учительница

Зайцева Мария
1. совершенная любовь
Любовные романы:
современные любовные романы
эро литература
8.73
рейтинг книги
Любимая учительница

Матабар V

Клеванский Кирилл Сергеевич
5. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар V

Двойник короля 11

Скабер Артемий
11. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 11

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

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

Моров. Том 5

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

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

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

Бальмануг. (Не) Любовница 2

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

Я – Легенда 2: геном хищника

Гарцевич Евгений Александрович
2. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фантастика: прочее
попаданцы
5.00
рейтинг книги
Я – Легенда 2: геном хищника

Черный дембель. Часть 5

Федин Андрей Анатольевич
5. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 5

Точка Бифуркации IX

Смит Дейлор
9. ТБ
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Точка Бифуркации IX

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2