socket - сокетный интерфейс Linux.
НАЗВАНИЕ
socket - сокетный интерфейс Linux
СИНТАКСИС
#include
mysocket = socket(int socket_family, int socket_type, int
protocol);
ОПИСАНИЕ
Эта страница документации описывает пользовательский
интерфейс уровня сетевых сокетов (от англ. "socket" -
разъем, гнездо) Linux. Совместимые с BSD сокеты - это
унифицированный интерфейс, служащий посредником между
процессами пользователя и стеком сетевых протоколов в
ядре. Модули протоколов группируются по семействам
протоколов, таким, как PF_INET, PF_IPX, PF_PACKET, и типам
сокетов, таким, как SOCK_STREAM или SOCK_DGRAM. Более
подробная информация о семействах и типах приведена в
socket(2).
ФУHЦКИИ УРОВHЯ СОКЕТОВ
Эти функции используются процессами пользователя для
передачи или приема пакетов и выполнения других операций
над сокетами. Более подробная информация приведена на
соответствующих страницах руководства. socket(2) создает
сокет, connect(2) присваивает сокету удаленный сокетный
адрес, функция bind(2) присваивает сокету локальный адрес,
listen(2) сообщает сокету, что должны приниматься новые
соединения, а accept(2) используется для получения нового
сокета для нового входящего соединения. socketpair(2)
возвращает два соединенных анонимных сокета (справедливо
только для некоторых локальных семейств, таких, как:
PF_UNIX).
send(2), sendto(2), и sendmsg(2) передают данные через
сокет, а recv(2), recvfrom(2) и recvmsg(2) принимают
данные из сокета. poll(2) и select(2) ожидают прихода
данных или готовятся к передаче данных. Кроме того, для
чтения и записи данных могут использоваться стандартные
операции ввода-вывода, такие, как: write(2), writev(2),
sendfile(2), read(2), и readv(2).
getsockname(2),- возвращает локальный адрес сокета, а get-
peername(2) возвращает удаленный адрес сокета. getsock-
opt(2) и setsockopt(2) используются для установки или
считывания опций протокола или уровня сокетов. ioctl(2)
может быть использована для установки или чтения некоторых
других опций.
close(2) используется для закрытия сокета. shutdown(2)
закрывает части полнодуплексного сокетного соединения.
Поиск (seeking) или вызов pread(2) и pwrite(2) (с
ненулевой позицией) для сокетов программой не
поддерживается.
Для сокетов возможно создание неблокируемого ввода/вывода
путем установки в файловый описатель сокета с помощью
fcntl(2)- флага O_NONBLOCK. При этом все операции,
которые будут блокироваться, будут (обычно) возвращать
EAGAIN (операция должна быть повторена позднее); con-
nect(2) возвратит ошибку EINPROGRESS. Пользователь может
подождать прихода различных событий через poll(2) или
select(2).
+---------------------------------------------------------------------------------+
| События ввода/вывода |
+--------------+-----------+------------------------------------------------------+
|Событие | Флаг poll | когда происходит |
+--------------+-----------+------------------------------------------------------+
|Чтение | POLLIN | пришли новые данные. |
+--------------+-----------+------------------------------------------------------+
|Чтение | POLLIN | Установка соединения завершена (для сокетов, |
| | | ориентированных на соединения) |
+--------------+-----------+------------------------------------------------------+
|Чтение | POLLHUP | Другая сторона инициировала запрос на разъединение. |
+--------------+-----------+------------------------------------------------------+
|Read | POLLHUP | Соединение разорвано (только для протоколов, |
| | | ориентированных на соединение). Если производится |
| | | запись в сокет, то также посылается сигнал SIGPIPE. |
+--------------+-----------+------------------------------------------------------+
|Запись | POLLOUT | Сокет имеет достаточно места в буфере передачи для |
| | | записи в него новых данных. |
+--------------+-----------+------------------------------------------------------+
|Чтение/запись | POLLIN| | Исходящий connect(2) завершен. |
| | POLLOUT | |
+--------------+-----------+------------------------------------------------------+
|Чтение/запись | POLLERR | произошла асинхронная ошибка. |
+--------------+-----------+------------------------------------------------------+
|Чтение/запись | POLLHUP | другая сторона закрыла (shut down) одно направление. |
+--------------+-----------+------------------------------------------------------+
|Исключение | POLLPRI | Пришли неотложные данные. При этом посылается сигнал |
| | | SIGURG. |
+--------------+-----------+------------------------------------------------------+
Альтернативой poll/select является возможность ядру
информировать приложение о событиях с помощью сигнала
SIGIO . Для этого необходимо установить с помощью
fcntl(2) в файловом описателе сокета флаг FASYNC, а также
назначить с помощью sigaction(2) корректный обработчик
сигнала SIGIO. См. ниже раздел СИГHАЛЫ
ОПЦИИ СОКЕТОВ
Следующие опции сокета могут быть установлены с помощью
setsockopt(2) или считаны с помощью getsockopt(2) при
уровне сокета, установленном для всех сокетов и равным
SOL_SOCKET:
SO_KEEPALIVE
Разрешить посылку "оживляющих" (keep-alive)
сообщений на сокетах, ориентированных на
соединение. Ожидается целочисленный логический
флаг.
SO_OOBINLINE
Если эта опция запущена, то внепоточные данные
помещаются непосредственно во входящий поток
данных. В противном случае внепоточные данные
передаются, только если во время приема установлен
флаг MSG_OOB.
SO_RCVLOWAT и SO_SNDLOWAT
Указать минимальное количество байтов в буфере при
приеме до того, как сокет определенного уровня
передаст данные протоколу (SO_SNDLOWAT) или
пользователю (SO_RCVLOWAT). Эти два значения
невозможно изменить в Linux, и размер их аргумента
фиксирован: он составляет 1 байт. getsockopt может
считывать их. setsockopt всегда будет возвращать
значение ENOPROTOOPT.
SO_RCVTIMEO и SO_SNDTIMEO
Указать время ожидания (при передаче или приеме)
сообщения об ошибке. Значения этих опций в Linux
зависят от протокола и не могут быть записаны или
считаны. Их функциональность может быть эмулирована
с помощью alarm(2) или setitimer(2).
SO_BSDCOMPAT
Разрешить совместимость ошибок (bug-to-bug) c
ошибками BSD. Используется только модулем протокола
UDP и в будущем будет удалена. Если функция
запущена, то полученные UDP-сокетом ошибки ICMP не
будут передаваться программе пользователя. В Linux
2.0 эта опция также включала совместимость ошибок
raw-сокетов (произвольное изменение заголовка,
пропуск флага многоадресной передачи), но в Linux
2.2 того уже не происходит. Лучше исправить
пользовательские программы, нежели приводить в
действие этот флаг.
SO_PASSCRED
Запустить или отключить прием управляющих сообщений
SCM_CREDENTIALS. За дополнительной информацией
обращайтесь к unix(7).
SO_PEERCRED
Возвращает информацию о процессе, подключенном к
сокету, с другой стороны. Эффективно только для
сокетов PF_UNIX; см. unix(7). Аргументом является
структура ucred. Эту опцию можно использовать
только с getsockopt.
SO_BINDTODEVICE
Подключить сокет к определенному устройству,
например, к "eth0", в соответствии с переданным
именем интерфейса. Если имя является пустой строкой
или длина опции равна нулю, то подключение сокета к
устройствам будет снято. В качестве опции
передается оканчивающаяся нулем строка переменной
длины с именем интерфейса, максимальная длина
которой не превышает IFNAMSIZ. Если сокет
подключен к интерфейсу, то им обрабатываются только
пакеты этого интерфейса. Заметим, что он сработает
только для некоторых типов сокетов, в частности,
для AF_INET сокетов. Он не поддерживает пакетные
сокеты (для них используйте bind(8) ).
SO_DEBUG
Начать отладку сокета. Разрешено только процессам с
возможностью CAP_NET_ADMIN или имеющих нулевой
идентификатор эффективного пользователя.
SO_REUSEADDR
Указывает, что правила проверки адресов,
передаваемых с помощью вызова bind(2), должны
позволять повторное использование локального
адреса. В случае с сокетами PF_INET это означает,
что сокет может быть подключен, но не в тех
случаях, когда активному слушающему сокету присвоен
адрес. Если существует слушающий сокет,
подключенный к определенному порту, с адресом
INADDR_ANY, то к этому порту невозможно будет
подключится с любого локального адреса.
SO_TYPE
Получает тип сокета в виде целого числа (как
SOCK_STREAM). Может использоваться только с get-
sockopt.
SO_DONTROUTE
Hе посылать сокеты через шлюз, посылать только на
машины, соединенные напрямую. Тот же эффект может
быть достигнут путем установки флага MSG_DONTROUTE
во время операции send(2) в сокете. В качестве
параметра ожидается целочисленный логический флаг.
SO_BROADCAST
Задать или считать флаг широкого вещания. Если он
установлен, то датаграммные сокеты принимают
пакеты, отправленные по широковещательному адресу,
и могут сами посылать пакеты по этому адресу. Эта
опция не воздействует на сокеты, ориентированные на
потоки.
SO_SNDBUF
Задает или считывает максимальный размер буфера
передачи сокета в байтах. Значение по умолчанию
устанавливается sysctl-вызовом wmem_default, а
максимальное значение устанавливается
sysctl-вызовом wmem_max.
SO_RCVBUF
Hазначает или считывает максимальный буфер приема
сокета в байтах. Значение по умолчанию
устанавливается sysctl-вызовом rmem_default, а
максимальное возможное значение устанавливается
sysctl-вызовом rmem_max.
SO_LINGER
Задает или считывает опцию SO_LINGER. Аргументом
является структура linger.
struct linger {
int l_onoff; /* задержка начата */
int l_linger; /* задержать на сколько секунд */
};
Если опция запущена, то вызовы close(2) или shut-
down(2) приведут к задержке процесса до отправки
всех сообщений в очереди сокета или до истечения
времени задержки. В противном случае выход из
вызовов будет произведен немедленно и закрытие
будет произведено в фоновом режиме. Если сокет
закрывается как часть вызова exit(2), то задержка
всегда происходит в фоновом режиме.
SO_PRIORITY
Установить определенный для протокола приоритет
всех пакетов, передаваемых из этого сокета. Linux
использует это значение для управления сетевыми
очередями: пакеты с более высоким приоритетом могут
быть обработаны раньше (в зависимости от выбранного
для устройства способа постановки в очередь). Для
ip(7) эта опция также устанавливает поле IP type-
of-service (TOS - тип службы) исходящих пакетов.
SO_ERROR
Получить и "сбросить" ожидающую обработки ошибку
сокета. Используется только с getsockopt. Ожидает
целое число.
СИГНАЛЫ
При записи локальной или удаленной стороной информации в
локальный сокет, ориентированный на соединение,
записывающему процессу посылается сигнал SIGPIPE, а
функция возвращает EPIPE. Сигнал не посылается, если была
вызвана функция записи с флагом MSG_NOSIGNAL.
Если был произведен fcntl-вызов FIOCSETOWN или ioctl-вызов
SIOCSPGRP, то при появлении событий ввода/вывода
посылается сигнал SIGIO. Для определения сокета, в
котором произошло событие, в обработчике можно
воспользоваться poll(2) или select(2). Альтернативным
способом в Linux 2.2 является установка сигналов реального
времени с помощью fcntl-вызова F_SETSIG; будет вызван
обработчик сигнала реального времени с файловым
описателем, обозначенным в поле si_fd его структуры sig-
info_t. Дополнительная информация приведена в fcntl(2).
В некоторых случаях (например, при наличии доступа
нескольких процессов к одному сокету) условие, вызвавшее
SIGIO, может исчезнуть на момент обработки процессом
сигнала. Если это происходит, то процесс должен подождать
сигнала еще какое-то время, так как Linux позже снова
пошлет его.
РАБОТА С ИНТЕРФЕЙСОМ SYSCTLS
Доступ к базовым сетевым вызовам sysctl-сокетов можно
получить с помощью файлов /proc/sys/net/core/* или через
интерфейс sysctl(2).
rmem_default
содержит значение буфера приема сокета в байтах,
используемое по умолчанию.
rmem_max
содержит максимальное значение буфера приема сокета
в байтах, которое может установить пользователь с
помощью опции сокета SO_RCVBUF.
wmem_default
содержит значение буфера приема сокета в байтах,
используемое по умолчанию.
wmem_max
содержит максимальное значение буфера приема сокета
в байтах, которое может установить пользователь с
помощью опции сокета SO_SNDBUF.
message_cost и message_burst
настраивают буферный фильтр, используемый для
ограничения нагрузки сети предупреждающими
сообщениями, вызванными внешними сетевыми
событиями.
netdev_max_backlog
Максимальное количество пакетов в глобальной
входящей очереди.
optmem_max
Максимальная длина вспомогательных данных и
управляющих данных пользователя, таких, как iovec,
в сокете.
ВЫЗОВЫ IOCTL
Доступ к вызовам ioctl можно получить с помощью ioctl(2):
error = ioctl(ip_socket, ioctl_type, &value_result);
SIOCGSTAMP
Возвратить структуру struct timeval с меткой
времени приема последнего пакета, переданного
пользователю. Это полезно для точного вычисления
времени. Описание struct timeval приведено в
setitimer(2).
SIOCSPGRP
Задать процесс или группу процессов, которым будут
посылаться сигналы SIGIO или SIGURG по окончании
выполнения асинхронной операции или при появлении
срочных данных. Аргумент является указателем на
pid_t. Если аргумент положителен, то сигналы будут
посылаться этому процессу. Если аргумент
отрицателен, то сигналы будут посылаться группе
процессов идентификатором, равным модулю аргумента.
Если процесс не имеет возможности CAP_KILL или его
эффективный идентификатор не равен нулю, то он
может указывать только на себя или свою группу
процессов.
FIOASYNC
Изменить флаг O_ASYNC для запуска или отключения
асинхронного режима ввода/вывода сокета. В
асинхронном режиме при появлении событий
ввода/вывода посылается сигнал SIGIO или сигнал,
установленный с помощью F_SETSIG.
Аргументом является целочисленный логический флаг.
SIOCGPGRP
Возвращает процесс или группу процессов, получающих
сигналы SIGIO или SIGURG. Если такой процесс не
задан, то возвращается нулевое значение.
Возможные вызовы fcntls:
FIOCGETOWN
То же, что и ioctl-вызов SIOCGPGRP.
FIOCSETOWN
То же, что и ioctl-вызов SIOCSPGRP.
ЗАМЕЧАНИЯ
Linux предполагает, что половина буфера приема/передачи
используется для размещения внутренних структур ядра;
поэтому вызовы sysctl в два раза больше, чем они кажутся.
НАЙДЕННЫЕ ОШИБКИ
Опции SO_ATTACH_FILTER и SO_DETACH_FILTER сокета CON-
FIG_FILTER не описаны. Рекомендуется использовать их с
помощью библиотеки libcap.
ВЕРСИИ
SO_BINDTODEVICE появилась в Linux 2.0.30. SO_PASSCRED
появилась в Linux 2.2. Вызовы sysctl появились в Linux
2.2.
АВТОРЫ
Эта страница руководства была написана Энди Клином (Andi
Kleen).
СМ. ТАКЖЕ
socket(2), ip(7), setsockopt(2), getsockopt(2), packet(7),
ddp(7)
Linux Man Page 7 May 1999 SOCKET(7)