2012-03-16 4 views
1

Я работаю над системой IPC для бэкэнд веб-клиента IM, закодированного в PHP. Я пытаюсь реализовать сокеты Unix, но у меня проблемы с повторным использованием созданного файла сокета. Вот код, который прослушивает сокет для событий.Повторное использование файлов Socket 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-сокетов, поэтому любая помощь будет принята с благодарностью!

ответ

1

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

5

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

Binding to a socket with a filename creates a socket in the file system that must be deleted by the caller when it is no longer needed (using `unlink(2)`). The usual UNIX close-behind semantics apply; the socket can be unlinked at any time and will be finally removed from the file system when the last reference to it is closed.

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

+0

Итак, это означает, что файл сокета должен быть удален после того, как скрипт будет выполнен, прослушивая его ... и это означает, что другой скрипт не смог открыть этот файл сокета и написать ему, если ничто не слушает его, что было моей целью. Я изучаю использование специального файла fifo (именованный канал), потому что похоже, что эти сокеты не будут работать. –

+0

Как насчет того, чтобы прослушивать один раз, но поместив обработку accept и client в цикл, чтобы вы могли обрабатывать несколько клиентов? –

+0

@NikolaiNFetissov, я попытался отключиться сразу после 'socket_bind', и файл был удален немедленно. Поэтому клиенты не могли подключиться. Что не так? – seelts

Смежные вопросы