を聞くが、私のコードです:PHP:ソケットはここで問題
<?php
$host = "127.0.0.1";
$portListen = 1234;
$portSend = 1240;
// create socket
$sSender = socket_create(AF_INET, SOCK_STREAM, 0);
socket_connect($sSender, $host, $portListen);
socket_write($sSender, "test", strlen ("test"));
$sListen = socket_create(AF_INET, SOCK_STREAM, 0);
socket_set_option($sListen, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sListen, $host, $portSend);
socket_listen($sListen,1);
$dataSock = socket_accept($sListen);
echo socket_read($dataSock, 3, PHP_NORMAL_READ);
// close sockets
socket_close($sSender);
socket_close($sListen);
?>
私は別のアプリケーションに "test" を送って、それを受け取り、 "ACK" を返送します。問題は、私はそれを一度しか行うことができないということです。リフレッシュすると、アドレスはすでに使用されているエラーになります。私はphp.netで提案された解決策を試みたが、役に立たなかった。 socket_close()の前にsocket_shutdown()を試行すると接続警告が表示されず、リフレッシュすると終わりのない読み込みができます。
ソケットがすぐに閉じられない理由は、バッファにまだデータがあるためです。しかし、あなたが見ることができるように、私は明示的に1つの接続だけを聞くように述べています。私はアプリケーションから3文字だけを送り、このスクリプトでは3文字を読みます。
私は間違っていますか?
私は2ソケットを使用している理由は、ソケット(ソケット)がすでに接続されているwrite()の後に聞くことができないためです。 write()の後にlisten()をスキップしてread()のためにまっすぐ進むと、無効な引数エラーが返されます。
これを行うもっと簡単な方法が見つかりました。このブログ記事をチェックしてください。 http://www.christophh.net/2012/07/24/php-socket-programming/ –