PHP Conference Nagoya 2025

socket_get_option

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

socket_get_optionПолучает опции потока для сокета

Описание

socket_get_option(Socket $socket, int $level, int $option): array|int|false

Функция socket_get_option() извлекает значение опции, которую определили для сокета socket в параметре option.

Список параметров

socket

Экземпляр Socket, созданный с помощью socket_create() или socket_accept().

level

Параметр level указывает уровень протокола, на котором находится опция. Например, для получения опций на уровне сокета, должен использовать параметр level, равный SOL_SOCKET. Другие уровни, такие как TCP, можно использовать, указав номер протокола этого уровня. Номера протоколов можно найти с помощью функции getprotobyname().

option
Доступные опции сокета
Опция Описание Тип
SO_DEBUG Сообщает, записывается ли отладочная информация. int
SO_BROADCAST Сообщает, поддерживается ли передача широковещательных сообщений. int
SO_REUSEADDR Сообщает, могут ли локальные адреса использоваться повторно. int
SO_REUSEPORT Сообщает, могут ли локальные порты использоваться повторно. int
SO_KEEPALIVE Сообщает, поддерживаются ли соединения с периодической передачей сообщений. Если подключённый сокет не отвечает на эти сообщения, подключение прерывается и процессы записи в этот сокет уведомляются сигналом SIGPIPE. int
SO_LINGER

Сообщает, будет ли socket останавливаться на socket_close(), если данные присутствуют. По умолчанию, когда сокет закрыт, он попытается отправить все неотправленные данные. В случае сокета, ориентированного на подключение, socket_close() будет ожидать, пока его одноранговый узел подтвердит данные.

Если l_onoff отличен от нуля, а l_linger равно нулю, все неотправленные данные будут отброшены и RST (сброс) отправлен одноранговому узлу в случае сокета, ориентированного на подключение.

С другой стороны, если l_onoff и l_linger отличны от нуля, socket_close() будет блокироваться до тех пор, пока все данные не будут отправлены или если время, указанное в l_linger, не истечёт. Если сокет не блокируется, socket_close() потерпит неудачу и вернёт ошибку.

array. Массив будет содержать два ключа: l_onoff и l_linger.
SO_OOBINLINE Сообщает, выходит ли socket из встроенных данных. int
SO_SNDBUF Сообщает размер отправленного буфера. int
SO_RCVBUF Сообщает о размере полученного буфера. int
SO_ERROR Сообщает информацию о статусе ошибки и очищает её. int (не может быть установлен socket_set_option())
SO_TYPE Сообщает о типе socket (например, SOCK_STREAM). int (не может быть установлен socket_set_option())
SO_DONTROUTE Сообщает, что исходящие сообщения обходят стандартные средства маршрутизации. int
SO_RCVLOWAT Сообщает минимальное количество байтов для обработки операций ввода socket. int
SO_RCVTIMEO Сообщает значение времени ожидания для операций ввода. array. Массив будет содержать два ключа: sec, который является частью секунд для значения времени ожидания и usec, который является микросекундной частью значения времени ожидания.
SO_SNDTIMEO Сообщает значение времени ожидания, указывающее количество времени, которое блокирует функция вывода, поскольку управление потоком предотвращает отправку данных. array. Массив будет содержать два ключа: sec, который является частью секунд для значения времени ожидания и usec, который является микросекундной частью значения времени ожидания.
SO_SNDLOWAT Сообщает минимальное количество байтов для обработки операцией вывода socket. int
TCP_NODELAY Сообщает, отключён ли алгоритм Nagle TCP. int
MCAST_JOIN_GROUP Присоединяется к многоадресной группе. массив (array) с ключами "group", указав строку (string) с многоадресным адресом IPv4 или IPv6 и "interface", указав либо номер интерфейса (тип int), либо строку (string) с именем интерфейса, например "eth0". 0 можно указать, чтобы сообщить, что интерфейс должен быть выбран с использованием правил маршрутизации. (может использоваться только в socket_set_option())
MCAST_LEAVE_GROUP Оставляет многоадресную группу. массив (array). Смотрите MCAST_JOIN_GROUP для получения дополнительной информации. (может использоваться только в socket_set_option())
MCAST_BLOCK_SOURCE Блокирует пакеты, поступающие из определённого источника в определённую группу многоадресной передачи, которые должны быть предварительно соединены. массив (array) с такими же ключами, как у MCAST_JOIN_GROUP, плюс один дополнительный ключ, source, который представляет строку (string), указывающую адрес IPv4 или IPv6 источника, который должен быть заблокирован. (может использоваться только в socket_set_option())
MCAST_UNBLOCK_SOURCE Разблокирует (начинает приём снова) пакеты, поступающие с определённого исходного адреса в определённую группу многоадресной передачи, которая должна предварительно соединена. массив (array) с таким же форматом, как у MCAST_BLOCK_SOURCE. (может использоваться только в socket_set_option())
MCAST_JOIN_SOURCE_GROUP Получать пакеты, предназначенные для конкретной группы многоадресной передачи, исходный адрес которого совпадает определённому значению. массив (array) с тем же самым форматом, что у MCAST_BLOCK_SOURCE. (может использоваться только в socket_set_option())
MCAST_LEAVE_SOURCE_GROUP Остановить приём пакетов, предназначенных для конкретной группы многоадресной передачи, исходный адрес которого совпадает определённому значению. массив (array) с тем же самым форматом, что у MCAST_BLOCK_SOURCE. (может использоваться только в socket_set_option())
IP_MULTICAST_IF Исходящий интерфейс для многоадресных пакетов IPv4. Любое целое число (int), указывающее номер интерфейса или строку (string) с именем интерфейса, например, eth0. Значение 0 может использоваться для указания, что таблица маршрутизации используется для выбора интерфейса. Функция socket_get_option() возвращает индекс интерфейса. Обратите внимание, что в отличие от C API, эта опция НЕ принимает IP-адрес. Это устраняет разницу в интерфейсе между IP_MULTICAST_IF и IPV6_MULTICAST_IF.
IPV6_MULTICAST_IF Исходящий интерфейс для многоадресных пакетов IPv6. То же, что и IP_MULTICAST_IF.
IP_MULTICAST_LOOP Политика петли групповой передачи для пакетов IPv4 включает или отключает передачу исходящих многоадресных рассылок, которые должны быть предварительно присоединены. Эффект, однако, различается, в зависимости от применения в Unix или Windows: в первом случае на пути получения, а во втором - на пути отправки. целое число (int) (либо 0, либо 1). Для socket_set_option() любое значение будет принято и преобразовано в тип boolean, согласно обычным правилам PHP.
IPV6_MULTICAST_LOOP Аналогично IP_MULTICAST_LOOP, но для IPv6. int. See IP_MULTICAST_LOOP.
IP_MULTICAST_TTL Время ожидания исходящих пакетов IPv4 для многоадресной передачи. Это должно быть значение между 0 (не оставлять интерфейс) и 255. Значение по умолчанию - 1 (достигается только локальная сеть). целое число (int) между 0 и 255.
IPV6_MULTICAST_HOPS Аналогично IP_MULTICAST_TTL, но для пакетов IPv6. Значение -1 также принимается, что означает использование маршрута по умолчанию. целое число (int) между 0 и 255.
SO_MARK Устанавливает идентификатор сокета для фильтрации пакетов в Linux. int
SO_ACCEPTFILTER Добавляет фильтр приёма на прослушиваемый сокет (FreeBSD/NetBSD). Модуль ядра фильтра приёма должен быть предварительно загружен в FreeBSD (например, accf_http). Строка (string) имя фильтра (длина не более 15).
SO_USER_COOKIE Устанавливает идентификатор сокета для фильтрации пакетов в FreeBSD. int
SO_RTABLE Устанавливает идентификатор сокета для фильтрации пакетов в OpenBSD. int
SO_DONTTRUNC Сохраняет непрочитанные данные. int
SO_WANTMORE Подсказывает, когда будет доступно больше данных. int
TCP_DEFER_ACCEPT Не уведомляет слушающий сокет, пока данные не будут готовы. int
SO_INCOMING_CPU Получает/устанавливает сродство к процессору для сокета. int
SO_MEMINFO Получает meminfo сокета. int
SO_BPF_EXTENSIONS Получает поддерживаемые ядром модули BPF для присоединения к сокету. int
SO_SETFIB Устанавливает таблицу маршрутизации (FIB) сокета (только FreeBSD). int
SOL_FILTER Фильтры, приписываемые сокету (только для Solaris/Illumos). int
TCP_KEEPCNT Устанавливает максимальное количество зондов keepalive, которые TCP должен отправить перед разрывом соединения. int
TCP_KEEPIDLE Устанавливает время, в течение которого соединение должно простаивать. int
TCP_KEEPINTVL Устанавливает время между отдельными зондами keepalive. int
TCP_KEEPALIVE Устанавливает время, в течение которого соединение должно простаивать (только для macOS). int
TCP_NOTSENT_LOWAT Устанавливает предельное количество неотправленных данных в очереди на запись потоком сокета (только для Linux). int

Возвращаемые значения

Возвращает значение заданной опции или false, если возникла ошибка.

Список изменений

Версия Описание
8.0.0 Теперь параметр socket ожидает экземпляр класса Socket; раньше параметр ожидал ресурс (resource).

Примеры

Пример #1 Пример использования socket_get_option()

<?php
$socket
= socket_create_listen(1223);

$linger = array('l_linger' => 1, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);

var_dump(socket_get_option($socket, SOL_SOCKET, SO_REUSEADDR));
?>

Смотрите также

  • socket_create_listen() - Открывает сокет на заданном порте для принятия соединений
  • socket_set_option() - Устанавливает опции для сокета

Добавить

Примечания пользователей 4 notes

up
5
Chad Lavoie
13 years ago
If using Unix Sockets, and you want to use SO_PEERCRED, you can use the number 17 for the optname (and SOL_SOCKET for the level). The PID of the connecting process will be returned.
up
3
recycling dot sp dot am at gmail dot com
14 years ago
Just 2 notes here:
- On UNIX, If SO_DEBUG is set, the php program needs an effective user id of 0.
- activating SO_OOBINLINE on a socket is equivalent to passing MSG_OOB flag to each recieving functions used with that socket (eg: socket_recv, socket_recvfrom).
up
1
prennings at gmail dot com
10 years ago
I was playing around with this option to use multiply socket connections with same hostname and same port (IRC). However the socket function needed for this is SO_REUSEPORT.

Though the majority of linux distro's does not have that yet officially implented in there distro's.

However for debian there is an patch that can be installed to get it working:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c617f398edd4db2b8567a28e899a88f8f574798d

it has some work but I got it working after a while (Noobie in debian) maybe some other people are facing the same problem as I was.
up
0
skydiablo at gmx dot net
2 years ago
to receive UDP DHCP packets on a dedicated interface, you have to use the undocumented option SO_BINDTODEVICE:

<?php
$socket
= socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

socket_set_option($socket, SOL_SOCKET, SO_BINDTODEVICE, 'eth1');
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEPORT, 1);

socket_bind($socket, '255.255.255.255', 67);
while (
1) {
if (
$src = @socket_recv($socket, $data, 9999, 0)) {
echo
$data . PHP_EOL;
}
}
?>
To Top