Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

Пространство имен сокета определяет способ записи адресов. Например, в локальном пространстве имен адреса — это обычные имена файлов. В пространстве имен Internet адрес сокета состоит из IP-адреса компьютера, подключенного к сети, и номера порта. Благодаря номерам портов можно различать сокеты, созданные на одном компьютере.

Протокол определяет способ передачи данных. Основными семействами протоколов являются TCP/IP (ключевые сетевые протоколы, используемые в Internet) и AppleTalk (протоколы, используемые системами Macintosh). Сокеты могут также работать в соответствии с локальным коммуникационным протоколом UNIX. Не все комбинации типов взаимодействия, пространств имен и протоколов поддерживаются.

5.5.2. Системные вызовы

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

■ 

socket
— создает сокет;

■ 

close
— уничтожает сокет;

■ 

connect
— устанавливает соединение между двумя сокетами;

■ 

bind
— назначает серверному сокету адрес;

■ 

listen
— переводит сокет в режим приема запросов на подключение;

■ 

accept
— принимает запрос на подключение и создает новый сокет, который будет обслуживать данное соединение.

Сокеты представляются в программе файловыми дескрипторами.

Создание и уничтожение сокетов

Функции

socket
и
close
создают и уничтожают сокет соответственно. В первом случае необходимо задать три параметра: пространство имен, тип взаимодействия и протокол. Константы, определяющие пространство имен, начинаются с префикса
PF_
(сокращение от "protocol family" — семейство протоколов). Например, константы
PF_LOCAL
и
PF_UNIX
соответствуют локальному пространству имен, а константа
PF_INET
— пространству имен Internet. Константы, определяющие тип взаимодействия, начинаются с префикса
SOCK_
. Сокетам, ориентированным на соединения, соответствует константа
SOCK_STREAM
, а дейтаграммным сокетам — константа
SOCK_DGRAM
.

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

socket
обычно задается значение 0 (выбор по умолчанию). В случае успешного завершения функция
socket
возвращает дескриптор сокета. Чтение и запись данных через сокеты осуществляется с помощью обычных файловых функций, таких как
read
,
write
и т.д. По окончании работы с сокетом его необходимо удалить с помощью функции
close
.

Вызов функции connect

Чтобы установить соединение между двумя сокетами, следует на стороне клиента вызвать функцию

connect
, указав адрес серверного сокета. Клиент — это процесс, инициирующий соединение, а сервер — это процесс, ожидающий поступления запросов на подключение. В первом параметре функции
connect
задается дескриптор клиентского сокета, во втором— адрес серверного сокета, в третьем — длина (в байтах) адресной структуры, на которую ссылается второй параметр. Формат адреса будет разным в зависимости от пространства имен.

Передача данных

При работе с сокетами можно применять те же самые функции, что и при работе с файлами. О низкоуровневых функциях ввода-вывода, поддерживаемых в Linux, рассказывается в приложении Б, "Низкоуровневый ввод-вывод". Имеется также специальная функция

send
, являющаяся альтернативой традиционной функции
write
.

5.5.3. Серверы

Жизненный цикл сервера можно представить так:

1) создание сокета, ориентированного на соединения (функция socket);

2) назначение сокету адреса привязки (функция bind);

3) перевод сокета в режим ожидания запросов (функция listen);

4) прием поступающих запросов (функция accept);

5) закрытие сокета (функция close).

Данные не записываются и не читаются напрямую через серверный сокет. Вместо этого всякий раз, когда сервер принимает запрос на соединение, ОС Linux создает отдельный сокет, используемый для передачи данных через это соединение.

Серверному сокету необходимо с помощью функции

bind
назначить адрес, чтобы клиент смог его найти. Первым аргументом функции является дескриптор сокета. Второй аргумент — это указатель на адресную структуру, формат которой будет зависеть от выбранного семейства адресов. Третий аргумент — это длина адресной структуры в байтах. После получения адреса сокет, ориентированный на соединения, должен вызвать функцию
listen
, тем самым обозначив себя как сервер. Первым аргументом этой функции также является дескриптор сокета. Второй аргумент определяет, сколько запросов может находиться в очереди ожидания. Если очередь заполнена, все последующие запросы отвергаются. Этот аргумент задает не предельное число запросов, которое способен обработать сервер. а максимальное количество клиентов, которые могут находиться в режиме ожидания.

  • Читать дальше
  • 1
  • ...
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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