重用PHP Unix套接字文件

时间:2012-03-16 14:14:14

标签: php sockets unix

我正在为一个用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);

第一次运行此脚本时,它会创建套接字文件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);

另一个脚本将输出收到的消息并退出。所以到目前为止所做的一切都按照我的预期进行。问题是,当我尝试重新执行监听脚本时,它会抛出此错误:

Warning: socket_bind() [function.socket-bind]: unable to bind address [98]: Address already in use

如果我跑

rm ~/tmp/sockets/test.sock

然后重新运行listen脚本重新创建套接字文件并正常工作。所以我的问题是:无论如何,监听脚本重新连接到现有的套接字文件,并且即使没有连接另一个脚本并且正在侦听该套接字文件,发送脚本是否可以写入套接字?我是unix套接字概念的新手,所以任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:5)

查看unix(7)手册页。接近尾声时说:

使用文件名绑定到套接字会在文件系统中创建一个套接字        当不再需要时,必须被调用者删除(使用`unlink(2)`)。        通常的UNIX封闭语义适用;套接字可以在任何地方取消链接        时间和最后一次引用时将最终从文件系统中删除        关闭它。

所以只需在服务器中的socket_bind()之后立即删除套接字文件。

答案 1 :(得分:1)

socket_close()不会删除文件,需要手动执行(unlink()) 至于你的第二个问题,我想它可能能够连接,但它发送的任何内容都将被删除。试试吧。