Мне нужно создать скрипт, который слушает сокет Unix и перенаправляет входящий поток на бот. Скрипты не могут подключиться. Проблемы, похоже, связаны с порядком вещей.
Доказательство дела
Я создал сокет и могу писать в него.
В сеансе 1 я создаю соединение слушателя
nc -lU /tmp/tg.sck
В сеансе 2 я пишу в сокет.
while true; do echo "hello"; sleep 2; done | nc -U /tmp/tg.sck
Выше работает только если я делаю это в таком порядке.
==> Запись перед прослушиванием приводит к ошибке.
Использование скриптов (не работает)
Когда я заменяю процесс листинга скриптом PHP (или Python), соединение отклоняется, потому что сокет не открыт.
$ python test.py
Connecting...
socket.error: [Errno 111] Connection refused
или же
$ php test.php
Warning: fsockopen(): unable to connect to unix:///tmp/tg.sck:-1 (Connection refused)
Изменение порядка вещей
Если я запускаю рабочий слушатель с помощью команды nc -lU /tmp/tg.sck
тогда сценарий не умирает, а процесс записи — умирает.
Сценарии слушателя
import socket
import sys
server_address = '/tmp/tg.sck' # Analogous to TCP (address, port) pair
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect(server_address)
sock.recv(512)
и скрипт php
$fp = fsockopen('unix:///tmp/tg.sck', -1, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
while (!feof($fp)) {
echo fgets($fp, 4096);
}
fclose($fp);
}
Когда я заменяю процесс листинга
…sock.connect(server_address)
Это не слушает, но соединяет.
Для прослушивания используйте bind
,listen
а также accept
так же, как вы делаете это с другими сокетами листинга (TCP, UDP):
server_address = '/tmp/tg.sck' # Analogous to TCP (address, port) pair
os.unlink(server_address)
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind(server_address)
sock.listen(2)
c,_ = sock.accept()
print c.recv(512)
Других решений пока нет …