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.
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
socket_get_option — Получает опции потока для сокета
Функция socket_get_option() извлекает значение для
опции, указанной параметром option
для заданного
socket
.
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 |
Сообщает, будет ли Если 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));
?>
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.
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).
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.
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;
}
}
?>