Я работаю над системой 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 сокетов, поэтому любая помощь будет принята с благодарностью!