从PHP脚本绑定到套接字时遇到问题


Trouble binding to a socket from a PHP script

我是PHP新手,所以这可能是一些简单的东西。无论如何,我试图在PHP脚本(由web客户端激活)和本地进程(用c++编写)之间创建双向通信。PHP脚本应该向c++进程发送一些信息,然后等待响应。我的问题是,设置这种通信的唯一方法似乎是使用socket_bind,但是当我这样做时,它失败了'地址已经在使用'错误。所讨论的套接字文件/tmp/sock已经由连续运行的c++进程创建(它不能由PHP脚本启动)。如果我使用socket_connect,只是写一些东西到c++进程,这工作得很好;但我需要绑定之前,我可以从PHP脚本监听套接字。下面是我的代码:

<?php
error_reporting(E_ALL);
/* Allow the script to hang around waiting for connections. */
set_time_limit(0);
/* Turn on implicit output flushing so we see what we're getting
 * as it comes in. */
ob_implicit_flush();
//Adapted from http://www.php.net/manual/en/sockets.examples.php
if (($sock = socket_create(AF_UNIX, SOCK_STREAM,0)) === false) 
{
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "'n";
    exit();
}
if (socket_bind($sock, '/tmp/sock') === false)  //Fails here
{
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "'n";
}  
....

谢谢——

您的c++和PHP代码必须将套接字标记为共享(SO_REUSE_ADDR)

事实证明,所需要的只是socket_read()。我没有意识到可以在同一个套接字上执行这两种操作(当它只是连接而不是绑定时)。PHP socket_read的用户hamishcool3有一个很好的实用函数,用于从套接字读取特定字符,直到到达(尽管它可能比标准的字节限制读取慢)。