无法从PHP脚本绑定到套接字

时间:2011-04-22 13:11:20

标签: php sockets bind qlocalsocket

我是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";
}  
....

谢谢 -

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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