Системные
вызовы
Виды
системных вызовов: socket
- создать сокет closes
- уничтожить сокет
connect
-
создать соединение между двумя сокетами
bind
- привязать сокет к порту сервера
listen
- настройка сокета для принятия
подключений
accept
- принять запрос на соединение и
создать сокет для процесса взаимодействия
Сокеты
представляются дескрипторами файлов.
С
помощью функций socket
и close
создаются и уничтожаются сокеты.
При создании сокета, необходимо
определить три параметра сокета:
пространство имен, стиль взаимодействия
и протокол.
Для
указания пространства имен используются
константы, начинающиеся с PF_
(сокращение "семейство протокола").
Например, PF_LOCAL
или PF_UNIX
определяют локальное пространство
имен, и PF_INET
определяет Интернет пространство
имен.
Второй
параметр, стиль взаимодействия,
представляет собой константу, начинающихся
с SOCK_ .
SOCKSTREAM определяет
стиль взаимодействия соединения,
SOCK_DGRAM
- стиль дейтаграммы.
Третий
параметр, протокол, определяет механизм
нижнего уровня для передачи и получения
данных. Для каждой комбинации пространство
имен - стиль взаимодействия существует
свой протокол.
Для
каждой пары существует лучший протокол,
поэтому можно указать О, что соответствует
этому протоколу. Если команда socket
выполнена успешно, в качестве
результата возвращается дескриптор
файла для сокета. С помощью команд read
и write ,
можно читать и записывать данные в
сокет.Создание и уничтожение сокетов
Вызов
connect
Для
создания соединение между двумя
сокетами, клиент вызывает connect
, передавая адрес сокета сервера
для подключения. Клиент - процесс,
инициализирующий соединение, а сервер
- процесс, ожидающий разрешения
соединения. Клиент посылает запрос
connect, чтобы
инициализировать соединение между
локальным сокетом и сокетом сервера,
переданным в качестве второго параметра.
В качестве третьего параметра передается
длина, в байтах, адресной структуры, на
которую указывает второй параметр.
Отправка
данных
Любая
техника записи в дескриптор файла,
может использоваться при записи в
сокет. Функция send
, определенная для дескрипторов
файлов сокета, аналогична функции write
с несколькими дополнительными
параметрами.
Серверы
Цикл
жизни сервера состоит из создания
сокета, привязки сокета к адресу, вызова
listen ,
разрешающего соединение с сокетом,
вызова accept ,
принимающего входящие соединения, и
затем закрытия сокета. Данные не читаются
и не записываются непосредственно
через сокет сервера; вместо этого,
каждый раз когда программа принимает
новое соединение, Linux
создает отдельный сокет, используется
при передаче данных по этому соединению.
В этом разделе рассматриваются вызовы
bind, listen
и accept .
С помощью команды bind
адрес сервера должен быть привязан
к сокету. Первый параметр команды -
дескриптор файла сокета. Второй параметр
- указатель на структуру адреса сервера,
формат которого зависит от семейства
адреса. Третий параметр - длина структуры
адреса, в байтах. Когда адрес связан с
сокетом стиля соединение, необходимо
вызвать listen ,
чтобы указать, что это - сервер. Первый
параметр команды - дескриптор файла
сокета. Второй параметр определяет,
длину очереди ожидающих соединений.
Если очередь заполнена, дополнительные
соединения будут отвергнуты. Это не
ограничивает общее количество соединений,
которые сервер может обработать; это
ограничивает только число клиентов,
пытающихся соединиться и не получивших
подтверждение. С помощью команды accept
сервер принимает запрос на соединение
от клиента. Первый параметр вызова -
дескриптор файла сокета. Второй параметр
указывает на структуру адреса сокета,
в которой хранится адрес клиентского
сокета. Третий параметр - длина, в байтах,
структуры адреса сокета. Сервер может
использовать адрес