簡體   English   中英

php(或python)偵聽unix域流套接字

[英]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) 

它不監聽,但可以連接。
要進行監聽,請使用bindlistenaccept與其他列表套接字(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM