Linux: Полное руководство
Шрифт:
Перед подключением к серверу нужно определить его IP-адрес:
Подключаемся к серверу:
После подключения к серверу принимаем его запрос, выводим на стандартный вывод, отправляем серверу свое сообщение и закрываем сокет:
27.3.9.
Поскольку мы используем набор протоколов AF_INET, то в этом пункте будем рассматривать только те опции сокетов, которые относятся к этому набору. Для работы с опциями сокета используются две функции:
♦ getsockopt — получение опций сокета;
♦ setsockopt — установка опций сокета.
Прототипы этих функций выглядят так:
Первый параметр, sd, — это дескриптор сокета. Второй параметр — уровень доступа (существует только один уровень — SOL_SOCKET). Следующий параметр, option_name, — это название опции, значение которой вы хотите изменить (см. таблицу 27.10). Последние два параметра — это значение опции и его размер.
Наиболее часто используемые опции сокетов Таблица 27.10
Название опции | Описание |
---|---|
SO_DEBUG | Включить/выключить (1/0) запись отладочной информации для сокета |
SO_BROADCAST | Включить/выключить (1/0) отправку широковещательных сообщений |
SO_REUSEADDR | Опция разрешает/запрещает использование локальных адресов |
SO_KEEPALIVE | Сохраняет неактивные соединения "в живых" путем посылки сообщений. Если данный сокет не отвечает на сообщения, соединение будет разорвано, а процессу, который осуществлял запись в сокет, будет послан сигнал SIGPIPE. Для включения KEEPALIVE нужно установить значение 1, для выключения — 0 |
SO_SNDBUF | Устанавливает размер буфера отправки, значение целого типа |
SO_RCVBUF | Устанавливает размер буфера приема, значение целого типа |
SO_SNDTIMEO | Установка таймаута для отправки сообщений. По умолчанию таймаут равен 0, то есть его вообще нет. Нужно передать значение типа struct timeval |
SO_RCVTIMEO | Установка таймаута для приема сообщений. По умолчанию таймаут равен 0, то есть его вообще нет. Нужно передать значение типа struct timeval |
TCP_NODELAY | Отключить (1) механизм буферизации сообщений, то есть они будут отправляться сразу, без задержки. Для включения механизма буферизации нужно указать значение 0 |
TCP_MAXSEG | Установить максимальный сегмент данных. Значение целого типа |
TCP_NOPUSH | Не использовать проталкивание (1) |
TCP_NOOPT | Не использовать опции TCP (1). Для использования опций передайте значение 0 |
В случае успешной установки параметра функция setsockopt возвращает 0; в случае ошибки возвращается -1, а переменная errno устанавливается следующим образом:
♦ EBADF — неверный дескриптор сокета:
♦ ENOTSOCK — указанный дескриптор является
файлом, а не сокетом;♦ EFAULT — нет доступа к адресу, на который указывает указатель
Функция getsockopt возвращает значение параметра. Кроме вышеперечисленных параметров, функция getsockopt может использовать следующие параметры:
♦ SO_ERROR — возвращает номер ошибки (будет в возвращаемом значении);
♦ SO_TYPE — возвращает тип сокета.
Рассмотрим небольшой пример работы с опциями сокетов. Мы установим размер буфера TCP.
27.3.10. Сигналы и сокеты
С сокетами связаны три сигнала:
♦ SIGIO — сокет готов к вводу/выводу. Сигнал посылается процессу, который связан с сокетом;
♦ SIGURG — сокет получил экспресс-данные (мы их использовать не будем, поэтому особо останавливаться на них нет смысла);
♦ SIGPIPE — запись в сокет больше невозможна. Сигнал посылается процессу, связанному с сокетом. Например, функция write вызывает сигнал SIGPIPE, если удаленный процесс завершен или связь по сети невозможна.
Пример обработки сигнала SIGPIPE приведен ниже.
Листинг 27.6. Обработка сигнала SIGPIPE
27.3.11. Мультиплексирование
В этой главе мы рассматривали пример программы-сервера, обрабатывающей запросы только от одного клиента. На практике все выглядит намного сложнее: серверу приходится одновременно обрабатывать запросы многих клиентов. Для мультиплексирования запросов клиентов используется системный вызов select. Этот вызов использует, например, суперсервер xinetd.