1

fsockopenとfwriteを使用してデータを送受信しています。私のアプリケーションは適切な応答を受け取りますが、続行する前に何らかのタイムアウトまで待機しているようです。応答の受信が終了した後、接続が正しく閉じられていない可能性があります。これは、待機を説明しています。誰かが私のコードを見てくれませんか?

private static function Send($URL, $Data) {
            $server = parse_url($URL, PHP_URL_HOST);
            $port = parse_url($URL, PHP_URL_PORT);

            // If the parsing the port information fails, we will assume it's on a default port.
            // As such, we'll set the port in the switch below.
            if($port == null) {
                switch(parse_url($URL, PHP_URL_SCHEME)) {
                    case "HTTP":
                        $port = 80;
                        break;
                    case "HTTPS":
                        $port = 443;
                        break;

                }
            }

            // Check if we are using a proxy (debug configuration typically).
            if(\HTTP\HTTPRequests::ProxyEnabled) {
                $server = \HTTP\HTTPRequests::ProxyServer;
                $port = \HTTP\HTTPRequests::ProxyPort;
            }

            // Open a connection to the server.
            $connection = fsockopen($server, $port, $errno, $errstr);
            if (!$connection) {
                die("OMG Ponies!");
            }

            fwrite($connection, $Data);

            $response = "";
            while (!feof($connection)) {
                $response .= fgets($connection);
            }
            fclose($connection);

            return $response;
        }
4

1 に答える 1

1

問題は次の行にあります。

while (!feof($connection)) {

ソケットはストリームです。反対側が最初に接続を閉じない限り、feof決して返さtrueれず、スクリプトは最終的にタイムアウトします。

正常なシャットダウンを実行するには、両方の当事者が接続の端を閉じる必要があります。一方が他方への応答としてそれを行うことができますが、明らかに、両方が他方が最初に閉じるのを待っている場合、誰もそうしません。

相手側のプログラムは何かを出力した後、接続を閉じますか? そうではないようです。

于 2012-04-10T23:40:01.457 に答える