socket_create_pair

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

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

Описание

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

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

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

domain

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

type

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

protocol

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

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

fd

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

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

Возвращает true в случае успешного завершения или false в случае возникновения ошибки.

Примеры

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

<?php
$sockets 
= array();

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

/* Создаём пару сокетов */
if (socket_create_pair($domainSOCK_STREAM0$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_UNIXSOCK_STREAM0$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], $stronestrlen($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], $strtwostrlen($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() - Возвращает строку, описывающую ошибку сокета