Содержание
1. Интерфейс сокетов
2. Заголовочные файлы сокетов
3. Принципы сокетов
4. Блокирующие и неблокирующие сокеты
Интерфейс сокетов
Сокеты Беркли — интерфейс программирования приложений (API), представляющий собой библиотеку для разработки приложений на языке C с поддержкой межпроцессного взаимодействия (IPC), часто применяемый в компьютерных сетях.
Сокеты Беркли (также известные как API сокетов BSD) впервые появились как API в операционной системе 4.1BSD Unix (выпущенной в 1982 году). Тем не менее, только в 1989 году Калифорнийский университет в Беркли смог начать выпускать версии операционной системы и сетевой библиотеки без лицензионных ограничений AT&T, действующих в защищённой авторским правом Unix.
API сокетов Беркли сформировал фактически стандарт абстракции для сетевых сокетов. Большинство прочих языков программирования используют интерфейс, схожий с API языка Си. API Интерфейса транспортного уровня (TLI), основанный на STREAMS, представляет собой альтернативу сокетному API. Тем не менее, API сокетов Беркли значительно преобладает в популярности и количестве реализаций.
Интерфейс сокета Беркли — API, позволяющий реализовывать взаимодействие между компьютерами или между процессами на одном компьютере. Данная технология может работать со множеством различных устройств ввода-вывода и драйверов, несмотря на то, что их поддержка зависит от реализации операционной системы. Подобная реализация интерфейса лежит в основе TCP/IP, благодаря чему считается одной из фундаментальных технологий, на которых основывается Интернет. Технология сокетов впервые была разработана в Калифорнийском университете Беркли для применения на UNIX системах. Все современные операционные системы имеют ту или иную реализацию интерфейса сокетов Беркли, так как это стало стандартным интерфейсом для подключения к сети Интернет. Программисты могут получать доступ к интерфейсу сокетов на трёх различных уровнях, наиболее мощным и фундаментальным из которых является уровень сырых сокетов. Довольно небольшое число приложений нуждается в ограничении контроля над исходящими соединениями, реализуемыми ими, поэтому поддержка сырых сокетов задумывалась быть доступной только на компьютерах, применяемых для разработки на основе технологий, связанных с Интернет. Впоследствии в большинстве операционных систем была реализована их поддержка, включая Windows XP.
Сокеты - это интерфейс для взаимодействия с транспортным уровнем. В отличие от протоколов транспортного уровня TCP и UDP, которые используются для связи между транспортными уровнями разных хостов, интерфейс сокетов используется для взаимодействия приложения с транспортным уровнем внутри одного компьютера.
Интерфейс сокетов был впервые предложен в Berkeley UNIX 4.2 BSD. Это файл специального вида, при записи данных в которой они передаются по сети.
Сокеты оказались удобным интерфейсом, поэтому различные варианты сокетов реализованы в разных операционных системах (в том числе в Windows и Linux) и языках программирования.
Операции сокетов:
socket - cозданиеновыго сокета
bind - установка связи сокета с IP-адресом и портом
listen - объявление о желании принимать соединения
accept - прием запроса на установку соединения
сonnect - установка соединения
send - отправка данные по сети
receive - получение данные из сети
close - закрытие соединения
Рисунок 1. Интерфейс сокетов
Рисунок 2. Стороны сокетов
Рисунок 3. Работа сокетов
Заголовочные файлы сокетов
Программная библиотека сокетов Беркли включает в себя множество связанных заголовочных файлов.
<sys/socket.h>
Базовые функции сокетов BSD и структуры данных.
<netinet/in.h>
Семейства адресов/протоколов PF_INET и PF_INET6. Широко используются в сети Интернет, включают в себя IP-адреса, а также номера портов TCP и UDP.
<sys/un.h>
Семейство адресов PF_UNIX/PF_LOCAL. Используется для локального взаимодействия между программами, запущенными на одном компьютере. В компьютерных сетях не применяется.
<arpa/inet.h>
Функции для работы с числовыми IP-адресами.
<netdb.h>
Функции для преобразования протокольных имен и имен хостов в числовые адреса. Используются локальные данные аналогично DNS.
Принципы сокетов
Как известно, для взаимодействия между машинами с помощью стека протоколов TCP/IP используются адреса и порты. Первое на текущий момент представляет собой 32-битный адрес (для протокола IPv4, 128-битный для IPv6), наиболее часто его представляют в символьной форме mmm.nnn.ppp.qqq (адрес, разбитый на четыре поля, разделённых точками, по одному байту в поле).Второе — это номер порта в диапазоне от 0 до 65535 (для протокола TCP).
Эта пара и есть сокет («гнездо», соответствующее адресу и порту).
В процессе обмена, как правило, используется два сокета — сокет отправителя и сокет получателя. Например, при обращении к серверу на HTTP-порт сокет будет выглядеть так: 194.106.118.30:80, а ответ будет поступать на mmm.nnn.ppp.qqq: xxxxx.
Каждый процесс может создать «слушающий» сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы (в UNIX непривилегированные процессы не могут использовать порты меньше 1024).
Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т. д.
Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. Доменный сокет Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта.
Обычно клиент явно «подсоединяется» к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером.