首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >php (或python)侦听unix域流套接字

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

Stack Overflow用户
提问于 2018-02-03 13:50:14
回答 1查看 881关注 0票数 1

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

案例的证明

我已经创建了一个套接字,我可以写到它。在第1节中,我创建一个侦听器连接。

代码语言:javascript
运行
复制
nc -lU /tmp/tg.sck

在第2节中,我将写入套接字。

代码语言:javascript
运行
复制
 while true; do echo "hello"; sleep 2; done | nc -U /tmp/tg.sck

只有在我按这个顺序做的时候,上面的方法才能起作用。在您拥有侦听器之前编写==>会导致错误。

使用脚本(不起作用)

当我用PHP (或Python)脚本替换列表进程时,由于套接字没有打开,连接将被拒绝。

代码语言:javascript
运行
复制
$ python test.py 
Connecting...
socket.error: [Errno 111] Connection refused

代码语言:javascript
运行
复制
$ php test.php 
Warning:  fsockopen(): unable to connect to unix:///tmp/tg.sck:-1 (Connection refused)

改变事物的顺序

如果我使用命令nc -lU /tmp/tg.sck启动一个工作的侦听器,那么脚本不会停止,但是编写进程会死。

侦听器脚本

代码语言:javascript
运行
复制
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脚本

代码语言:javascript
运行
复制
$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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-03 14:04:36

当我替换列表过程时 ..。sock.connect(server_address)

这不听,但它连接。

要侦听,请使用bindlistenaccept,与使用其他列表套接字(TCP、UDP)的方式相同:

代码语言:javascript
运行
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48598089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档