Наследование сокетов и завершение процессов

Для запуска новых прикладных программ в системе UNIX используются функции fork и exec. Этот процесс состоит из двух этапов. На первом этапе функция fork создает отдельную копию выполняющейся в текущий момент прикладной программы. На втором этапе новая копия заменяется вновь запускаемой прикладной программой. Когда программа вызывает функцию fork, только что созданная копия унаследует права доступа ко всем открытым сокетам (точно так же, как и ко всем открытым файлам). Когда программа вызывает функцию exec, для нового приложения сохраняются права доступа ко всем открытым сокетам. Ниже будет показано, что главная программа сервера использует свойство наследования сокетов при создании подчиненных программ, обрабатывающих запросы, которые поступают через заданное соединение. Что касается внутренней структуры, операционная система ведет счетчик числа обращений к каждому сокету, поэтому ей всегда точно известно, сколько прикладных программ (процессов) имеют к нему доступ. ремонт якорей тяговых электродвигателей

И старый, и новый процессы имеют одинаковые права доступа к существующим сокетам, и оба могут получить к ним доступ. Таким образом, ответственность за обеспечение корректного использования общего сокета двумя процессами несет программист.

По завершении использования сокета процесс вызывает функцию close, которая имеет следующий синтаксис:

close(сокет)

Здесь параметр сокет задает дескриптор сокета, который необходимо закрыть. Если процесс по какой-либо причине прекращается, система закрывает все сокеты, которые остались открытыми. Что касается внутренней структуры, вызов функции close уменьшает на единицу значение счетчика числа обращений к конкретному сокету. Если значение счетчика становится равным нулю, сокет аннулируется.

Определение локального адреса

При создании сокета он не связывается ни с адресом локальной машины, ни с удаленным адресом получателя. При использовании семейства протоколов TCP/IP это означает, что сокету не присваивается ни номер локального порта протокола, ни адрес порта получателя, ни его IP-адрес. В большинстве случаев прикладным программам не нужна информация о локальном адресе машины, на который они работают, поскольку выбор одного из локальных адресов осуществляется программами поддержки протокола. Однако серверные процессы, которые должны быть привязаны к одному из стандартных портов, должны уметь указывать этот порт системе. Поэтому после создания сокета сервер с помощью функции bind назначает ему локальный адрес. Функция bind имеет следующий синтаксис:

Определение локального адреса bind(сокет, локальный-адрес, длина-адреса)

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

Структура ockaddr начинается с 16-битового поля, определяющего семейство протоколов, к которому принадлежит адрес. После него следует сам адрес длиной до октетов. При объявлении в языке С, структура sockaddr должна быть объединением (union) структур, определяющих все возможные семейства адресов.

Значение в поле идентификатора семейства адресов определяет формат остальных полей структуры. Например, если значение идентификатора равно 2, то это означает, что в остальных октетах адреса задан адрес протокола TCP/IP5. Способ интерпретации октетов в поле адреса структуры sockaddr зависит от семейства протоколов. Для передачи интерфейсу сокета адресов протокола TCP/IP используется структура, которая называется sockaddr_in. В ней указывается IP-адрес машины и ее номер порта протокола (рис. 22.2).

Хотя при вызове функции bind в адресной структуре можно указать произвольные значения, не все возможные привязки являются корректными. Например, вызывающая программа может запросить номер локального порта протокола, который уже используется другой программой, или указать недействительный IP-адрес. В таких случаях функция bind завершает свою работу аварийно и возвращает соответствующий код ошибки.

Похожие статьи Меню Опрос Фото Популярное