我正在为一个用PHP编码的Web IM客户端后端的IPC系统工作.我正在尝试实现Unix套接字,但是在重用创建的套接字文件时遇到了麻烦.这是在套接字上侦听事件的代码.
<?php
$socket_file = "../tmp/sockets/test.sock";
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_bind($socket, $socket_file);
socket_listen($socket);
socket_select($temp = array($socket), $temp = null, $temp = null, 20);
$client = socket_accept($socket);
socket_set_nonblock($client);
$buffer = socket_read($client, 2048);
echo $buffer;
socket_close($client);
socket_close($socket);
Run Code Online (Sandbox Code Playgroud)
当第一次运行此脚本时,它会创建套接字文件test.sock并等待连接.然后当我运行发送脚本时:
<?php
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($socket, "../tmp/sockets/test.sock");
$msg = "\nThis is a test\r\n";
socket_write($socket, $msg, strlen($msg));
socket_close($socket);
Run Code Online (Sandbox Code Playgroud)
另一个脚本将输出收到的消息并退出.所以到目前为止所做的一切都按照我的预期进行.问题是,当我尝试重新执行监听脚本时,它会抛出此错误:
Warning: socket_bind() [function.socket-bind]: unable to bind address [98]: Address already in use
Run Code Online (Sandbox Code Playgroud)
如果我跑
rm ~/tmp/sockets/test.sock
Run Code Online (Sandbox Code Playgroud)
然后重新运行listen脚本,它重新创建套接字文件并正常工作.所以我的问题是:无论如何,监听脚本重新连接到现有的套接字文件,并且发送脚本是否可以写入套接字,即使另一个脚本没有连接并监听该套接字文件?我是unix套接字概念的新手,所以任何帮助都将不胜感激!
| 归档时间: |
|
| 查看次数: |
5498 次 |
| 最近记录: |