php (или python) слушает сокет потока домена unix

Мне нужно создать скрипт, который слушает сокет 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);
}

1

Решение

Когда я заменяю процесс листинга

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)
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]