Повторное использование файлов сокетов PHP Unix - PullRequest
1 голос
/ 16 марта 2012

Я работаю над системой IPC для серверной части веб-клиента IM, написанного на PHP.Я пытаюсь реализовать сокеты Unix, но у меня возникают проблемы при повторном использовании созданного файла сокетов.Вот код, который прослушивает в сокете события.

<?php

$socket_file = "../tmp/sockets/test.sock";

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);

socket_bind($socket, $socket_file);
socket_listen($socket);

socket_select($temp = array($socket), $temp = null, $temp = null, 20);

$client = socket_accept($socket);
socket_set_nonblock($client);
$buffer = socket_read($client, 2048);

echo $buffer;

socket_close($client);
socket_close($socket);

Когда этот скрипт запускается в первый раз, он создает файл сокета test.sock и ожидает подключения.Затем, когда я запускаю скрипт отправки:

<?php

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);

socket_connect($socket, "../tmp/sockets/test.sock");

$msg = "\nThis is a test\r\n";

socket_write($socket, $msg, strlen($msg));

socket_close($socket);

Другой скрипт выведет полученное сообщение и выйдет.Так что все до этого момента работает так, как я ожидаю.Проблема в том, что когда я пытаюсь повторно выполнить сценарий прослушивания, он выдает эту ошибку:

Warning: socket_bind() [function.socket-bind]: unable to bind address [98]: Address already in use

Если я запускаю

rm ~/tmp/sockets/test.sock

Затем повторно запускаем сценарий прослушивания, он воссоздает файл сокета иработает отлично.Итак, мой вопрос: существует ли в любом случае сценарий прослушивания для повторного подключения к существующему файлу сокета, и может ли сценарий отправки записывать в сокет, даже если другой сценарий не подключен и прослушивает этот файл сокета?Я новичок в концепции Unix сокетов, поэтому любая помощь будет принята с благодарностью!

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

Взгляните на unix(7) справочную страницу. Под конец написано:

Привязка к сокету с именем файла создает сокет в файловой системе, который должен быть удален вызывающим , когда он больше не нужен (с помощью `unlink (2)`). Применяется обычная скрытая семантика UNIX; розетка может быть отключена в любом время и будет окончательно удален из файловой системы при последнем обращении ему закрыто.

Так что просто удалите файл сокета сразу после socket_bind() на сервере.

1 голос
/ 16 марта 2012

socket_close () не удаляет файл, вам нужно сделать это вручную (unlink ()). Что касается вашего второго вопроса, я думаю, что он может подключиться, но все, что он отправляет, будет отброшено.просто попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...