【问题标题】:php (or python) listen to unix domain stream socketphp(或python)监听unix域流套接字
【发布时间】:2018-07-13 20:44:22
【问题描述】:

我需要创建一个脚本来侦听 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);
}

【问题讨论】:

    标签: php python sockets unix-socket


    【解决方案1】:

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

    sock.connect(server_address)
    

    这不听,但它连接。
    要监听使用 bind,listenaccept,就像使用其他列表套接字(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)
    

    【讨论】:

    • 很好的解决方案@steffen。你能解释一下 c,_ = .... 行吗(我是 python 新手,以前没见过)。
    • @crafter: c,_ = ... 仅表示获取accept 返回的两个参数,但忽略第二个参数,因为代码中不需要它。另见stackoverflow.com/questions/26251861/…
    猜你喜欢
    • 1970-01-01
    • 2014-07-18
    • 2013-03-29
    • 2023-03-09
    • 2011-08-11
    • 2013-01-17
    • 2016-11-06
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多