(PHP 5, PHP 7, PHP 8)
stream_socket_server — Создаёт серверный сокет Internet- или Unix-домена
$address
,&$error_code
= null
,&$error_message
= null
,$flags
= STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,$context
= null
Функция создаёт сокет потока или датаграммы на адресе,
который установили в параметре 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
.