php(或python)监听unix域流socket
php (or python) listen to unix domain stream socket
我需要创建一个脚本来侦听 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);
}
When I replace the listing process
...
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)
我需要创建一个脚本来侦听 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);
}
When I replace the listing process
...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)