[英]php (or python) listen to unix domain stream 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);
}
當我替換上市流程
...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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.