【问题标题】:Trouble binding to a socket from a PHP script从 PHP 脚本绑定到套接字时遇到问题
【发布时间】:2011-04-22 13:11:19
【问题描述】:

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

谢谢--

【问题讨论】:

    标签: php sockets bind qlocalsocket


    【解决方案1】:

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

    【讨论】:

    • 谢谢——我在脚本中添加了 socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1),虽然它没有返回无效的操作错误,但我仍然遇到同样的问题。我还需要用 C++ (Qt) 做些什么吗?我之前使用过 QLocalSockets,没有任何明确的共享,并且没有问题。 /tmp/sock 是 777,权限方面。
    • @Haendel 我不确定你的想法,这个问题出现在我想要关闭套接字之前。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 2017-01-12
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多