stream_socket_server

(PHP 5, PHP 7, PHP 8)

stream_socket_serverСоздаёт серверный сокет Internet- или Unix-домена

Описание

stream_socket_server(
    string $address,
    int &$error_code = null,
    string &$error_message = null,
    int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
    ?resource $context = null
): resource|false

Функция создаёт сокет потока или датаграммы на адресе, который установили в параметре address.

Функция только создаёт сокет, а начать приём соединений помогает функция stream_socket_accept().

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

address

Тип сокета, который создаёт функция, определяет транспорт, который указывается стандартным форматированием URL-адресов: transport://target.

Для AF_INET-сокетов интернет-домена наподобие TCP и UDP часть target параметра remote_socket требуется указать в виде имени хоста или IP-адреса, за которыми идёт двоеточие и номер порта. Для сокетов Unix-домена часть target должна указывать на файл сокета в файловой системе.

Сокеты Unix-домена доступны не в каждом окружении. Список доступных транспортов возвращает функция stream_get_transports(). Список встроенных транспортов приводит раздел «Список транспортных протоколов для работы с сокетами».

error_code

Функция заполнит параметры error_code и error_message значениями, которые укажут действительный уровень ошибки системного уровня, которая возникла при вызовах системного уровня socket(), bind() и listen(), если при вызове функции передали аргументы для этих параметров. Если в параметр error_code вернулось значение 0, а функция вернула false, значит, ошибка возникла до системного вызова bind(). Самая частая причина — проблема инициализации сокета. Обратите внимание, что аргументы error_code и error_message передаются по ссылке.

error_message

Смотрите описание параметра error_code.

flags

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

Замечание:

Для UDP-сокетов требуется указывать константу STREAM_SERVER_BIND как флаг параметра flags.

context

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

Функция возвращает новый поток или false, если возникла ошибка.

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

Версия Описание
8.0.0 Параметр context теперь принимает значение null.

Примеры

Пример #1 Пример использования серверных TCP-сокетов

<?php

$socket
= stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);

if (!
$socket) {
echo
"$errstr ($errno)<br />\n";
} else {
while (
$conn = stream_socket_accept($socket)) {
fwrite($conn, 'Локальное время ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);
}

?>

Следующий пример показывает, как действовать как сервер времени, который умеет отвечать на запросы времени, как показывает пример с функцией stream_socket_client().

Замечание: На большей части систем требуется доступ с правами пользователя root, чтобы создать серверный сокет на порту ниже 1024-го.

Пример #2 Пример использования серверных сокетов UDP

<?php

$socket
= stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);

if (!
$socket) {
die(
"$errstr ($errno)");
}

do {
$pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
echo
"$peer\n";
stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while (
$pkt !== false);

?>

Примечания

Замечание: Числовые IPv6-адреса наподобие fe80::1 берут в квадратные скобки. Например: tcp://[fe80::1]:80.

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

  • stream_socket_client() - Открывает соединение с интернет-сокетом или с доменным Unix-сокетом
  • stream_set_blocking() - Устанавливает блокирующий или неблокирующий режим для потока
  • stream_set_timeout() - Устанавливает значение времени ожидания для потока
  • fgets() - Получает строку из указателя на файл
  • fgetss() - Читает строку из файла и удаляет HTML-теги
  • fwrite() - Записывает данные в файл в бинарно-безопасном режиме
  • fclose() - Закрывает открытый дескриптор файла
  • feof() - Проверяет, достигнут ли конец файла
  • Модуль curl