PHP 8.4.2 Released!

socket_create_pair

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

socket_create_pairСоздаёт пару неразличимых сокетов и сохраняет их в массиве

Описание

socket_create_pair(
    int $domain,
    int $type,
    int $protocol,
    array &$pair
): bool

socket_create_pair() создаёт два соединённых и неразличимых сокета, и сохраняет их в массиве pair. Эта функция обычно используется IPC (межпроцессном взаимодействии).

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

domain

Параметр domain определяет семейство протоколов, которое будет использоваться сокетом. Смотрите их полный список в описании функции socket_create().

type

Параметр type указывает тип коммуникации, которая будет использоваться сокетом. Смотрите их полный список в описании функции socket_create().

protocol

Параметр protocol устанавливает определённый протокол в указанном семействе протоколов domain, который будет использоваться при связи с полученными сокетами. Соответствующее значение может быть получено по имени при помощи функции getprotobyname(). Если требуемый протокол TCP или UDP, то соответствующие константы SOL_TCP и SOL_UDP также могут быть использованы.

Смотрите полный список поддерживаемых протоколов в описании функции socket_create().

pair

Ссылка на массив, в который будут вставлены два экземпляра Socket.

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

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

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

Версия Описание
8.0.0 pair является ссылкой на массив экземпляров Socket; ранее являлся ссылкой на массив ресурсов (resource).

Примеры

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

<?php
$sockets
= array();

/* На Windows нам нужно использовать AF_INET */
$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);

/* Создаём пару сокетов */
if (socket_create_pair($domain, SOCK_STREAM, 0, $sockets) === false) {
echo
"Не получилось выполнить socket_create_pair. Причина: ".socket_strerror(socket_last_error());
}
/* Отправляем и получаем данные */
if (socket_write($sockets[0], "ABCdef123\n", strlen("ABCdef123\n")) === false) {
echo
"Не получилось выполнить socket_write(). Причина: ".socket_strerror(socket_last_error($sockets[0]));
}
if ((
$data = socket_read($sockets[1], strlen("ABCdef123\n"), PHP_BINARY_READ)) === false) {
echo
"Не получилось выполнить socket_read(). Причина: ".socket_strerror(socket_last_error($sockets[1]));
}
var_dump($data);

/* Закрываем сокеты */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>

Пример #2 Пример использования socket_create_pair() в IPC

<?php
$ary
= array();
$strone = 'Сообщение от родительского процесса.';
$strtwo = 'Сообщение от дочернего процесса.';

if (
socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $ary) === false) {
echo
"Не получилось выполнить socket_create_pair(). Причина: ".socket_strerror(socket_last_error());
}
$pid = pcntl_fork();
if (
$pid == -1) {
echo
'Не могу создать новый процесс.';
} elseif (
$pid) {
/*родительский процесс*/
socket_close($ary[0]);
if (
socket_write($ary[1], $strone, strlen($strone)) === false) {
echo
"Не получилось выполнить socket_write(). Причина: ".socket_strerror(socket_last_error($ary[1]));
}
if (
socket_read($ary[1], strlen($strtwo), PHP_BINARY_READ) == $strtwo) {
echo
"Получено $strtwo\n";
}
socket_close($ary[1]);
} else {
/*дочерний процесс*/
socket_close($ary[1]);
if (
socket_write($ary[0], $strtwo, strlen($strtwo)) === false) {
echo
"Не получилось выполнить socket_write(). Причина: ".socket_strerror(socket_last_error($ary[0]));
}
if (
socket_read($ary[0], strlen($strone), PHP_BINARY_READ) == $strone) {
echo
"Получено $strone\n";
}
socket_close($ary[0]);
}
?>

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

  • socket_create() - Создаёт сокет (конечную точку для обмена информацией)
  • socket_create_listen() - Открывает сокет на заданном порте для принятия соединений
  • socket_bind() - Привязывает имя к сокету
  • socket_listen() - Прослушивает входящие соединения на сокете
  • socket_last_error() - Возвращает последнюю ошибку сокета
  • socket_strerror() - Возвращает строку, описывающую ошибку сокета

Добавить

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

up
3
cweiske at php dot net
15 years ago
The underlying sockpair() function does only support AF_UNIX at least on BSD and Linux.
To Top