1

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

谢谢 -

4

2 回答 2

2

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

于 2011-04-22T13:26:11.457 回答
0

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

于 2011-04-23T02:37:40.570 回答