4

PHP内でsocket_selectを使用してデータを送受信する正しい方法は何ですか?

TCPとUDPの両方のパケット接続を可能にするサーバーへの接続があり、両方を利用しています。これらの接続内では、同じポートでパケットを送受信していますが、TCPパケットは1つのポート(29999)で送信され、UDPは別のポート(30000)で送信されます。送信タイプは。のタイプになりますAF_INET。IPアドレスはループバックになります127.0.0.1

このシナリオでソケット接続を作成する方法について多くの質問があります。たとえば、socket_create_pairを使用して接続を確立するか、socket_createの後にsocket_connectを続けて、 socket_selectを実装する方がよいでしょうか。

サーバーからクライアントにデータが送信されない可能性があり、接続を維持するのはクライアントの責任です。これは、socket_select呼び出し内のタイムアウト関数を利用して実行されます。制限時間内にデータが送信されない場合、socket_select関数は中断され、キープアライブパケットを送信できます。次のスクリプトはクライアントのものです。

// Create
$TCP = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$UDP = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

// Misc
$isAlive = TRUE;
$UDPPort = 30000;
define('ISP_ISI', 1);

// Connect
socket_connect($TCP, '127.0.0.1', 29999);
socket_connect($UDP, '127.0.0.1', $UDPPort);

// Construct Parameters
$recv = array($TCP, $UDP);
$null = NULL;

// Make The Packet to Send.
$packet = pack('CCCxSSxCSa16a16', 44, ISP_ISI, 1, $UDPPort, 0, '!', 0, 'AdminPass', 'SocketSelect');

// Send ISI (InSim Init) Packet
socket_write($TCP, $packet);

/* Main Program Loop */
while ($isAlive == TRUE)
{
    // Socket Select
    $sock = socket_select($recv, $null, $null, 5);

    // Check Status
    if ($sock === FALSE)
        $isAlive = FALSE; # Error
    else if ($sock > 0)
        # How does one check to find what socket changed?
    else
        # Something else happed, don't know what as it's not in the documentation, Could this be our timeout getting tripped?
}
4

1 に答える 1

1

私は少し混乱しています-2つのソケットを介して着信する非同期リクエストを処理しようとしているようですが、どちらもクライアントとして機能していますか?これは非常に珍しいシナリオです。異なるプロトコル(tcpとudp)を使用してそれらを実装しようとすることは、さらに奇妙です(H323 VOIPは、私が知っている唯一のアプリケーションです)。簡単なグーグルはあなたがLFS用のクライアントを書き込もうとしていることを示唆しています-しかしなぜあなたはTCPとUDPクライアントを同時に実行する必要があるのですか?(ところで、彼らは適切なPHPクライアントコードをWikiのhttp://en.lfsmanual.netで公開しています)

読み取りを待機しているデータを持つソケットは、socket_select()の呼び出し後に$ recv配列に含まれます(つまり、配列はトリミングされ、socket_select()の次の反復の前に再入力する必要があります)。

socket_selectが0を返す場合は、ソケットが非ブロッキングであり、使用可能なデータがないことを意味します。

HTH

C。

于 2010-04-07T15:51:46.860 に答える