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)
Другие вопросы по тегам