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 に答える