1

こんにちは、以下の socket_read 関数に問題があります。データの読み取りが終了した後、空の文字列 '' が返されません。socket_read() への 2 回目の呼び出しでは、そこでハングするだけで、ページはブラウザーに読み込まれ続け、戻りません。サーバーが接続を閉じると機能しますが、サーバーがクライアントソケットを閉じる必要がありますか? ありがとう

    $json = $_GET['json'];

    /* Get the port for the WWW service. */
    // $service_port = getservbyname('www', 'tcp');
    $service_port = "1111";

    /* Get the IP address for the target host. */
    $address = "192.168.3.5";

    /* Create a TCP/IP socket. */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
        echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
        die();
    } else {
        //echo "OK.\n";
    }

    //echo "Attempting to connect to '$address' on port '$service_port'...";
    $result = socket_connect($socket, $address, $service_port);
    if ($result === false) {
        echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
        die();
    } else {
        //echo "OK.\n";
    }

    $out = '';

    //echo "Sending HTTP HEAD request...";
    $result = socket_write($socket, $json, strlen($json));

    if ($result === false) {
        echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
        die();
    } else {
        //echo "OK.\n";
    }



    echo socket_read($socket, 2048);
    echo socket_read($socket, 2048);
//  
     // while (socket_read($socket, 2048) !== '') {
        // echo $out;
//       
     // }
//   
     socket_close($socket);
4

1 に答える 1

1

はい、それはまさに私が期待することです-socket_read()は、バイナリを開いてサーバーが「\ 0」で応答しない限り、空の文字列を返すことはありません。

HTTPクライアントを作成しようとしているようです。もしそうなら、今すぐやめて、コードを捨てて、Curl拡張機能を読んでください。HTTPは単純なプロトコルではありません。単純なものがどのように機能するかについては、まだ多くのことを学ぶ必要があります。現在、データフローを決定するためにソケットの状態とデータの形式に依存していますが、HTTPはどちらも使用していません。

HTTPがどのように機能するかを知りたい場合は、インターネット上に多くのドキュメントがあります。RFCは必須ですが、穏やかな紹介ではありません。アプリケーションを開発することが目的の場合は、curl(またはHTTPストリームラッパー)を使用します。

于 2013-03-13T11:59:47.313 に答える