php(或python)监听unix域流套接字

时间:2018-02-03 13:50:14

标签: php python sockets unix-socket

我需要创建一个侦听unix套接字并将传入流转发给bot的脚本。脚本无法连接。问题似乎与事物的顺序有关。

案例证明

我创建了一个套接字,我可以写入它。 在会话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 个答案:

答案 0 :(得分:2)

  

当我更换上市流程时   ......

sock.connect(server_address)

这不是听,而是连接 要像使用其他列表套接字(TCP,UDP)一样使用bindlistenaccept进行收听:

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)