0
  1. 私は非常に単純なソケットサーバーを作成しました。
  2. ポスト63254でリッスンします。
  3. 最初にsocket_create、socket_bind、socket_listenを実行したので、ここで接続がリッスンしています。
  4. 次に、ループでソケットaccpetを実行します。だからここで別の話を聞いてください。
  5. 読み取り関数は、入力出口まで読み取ります。
  6. その後、socket_acceptによるリソースIDが閉じます。
  7. その後、メイン接続が閉じます。

すべての接続を閉じた後、TCPviewでこのプロセスを確認すると、63254以降のTIME_WAITを示すシステムプロセスが表示されます。

接続しているソケットサーバープログラムを再度実行すると、1つの完全なプロセスが終了すると、すべての接続が閉じられ、プログラムが終了し、同じポートに対して別のTIME_WAITが表示されます。それでも、3回目に同じポートに接続できました。

スタックオーバーの質問の回答では、待機状態のポートに対して接続を行うことができないと言われています。

Firefoxブラウザを開いて4つの接続を開きました。私がそれを閉じたとき、それはすべて閉じられ、システムプロセスは2分間の4回の待機を示しました。すべての時間待機は2分間滞在し、消えます。

したがって、私が結論付けるのは、接続が閉じるたびに待機時間が発生し、回避できないということです。

私はスタックオーバーフローフローで多くの投稿を読みましたが、それでも確信が持てませんでした。

コマンドラインで次のコードを実行します。

私のサーバーコード

<?
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush(); 

$str = '';
$buff = '';

$s = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if(!$s)die('Unable to create socket');

if(!socket_bind($s,'127.0.0.1',63254))
    die("\nTrying to Bind: ".socket_strerror(socket_last_error()));

if(!socket_listen($s,1))
    die(socket_strerror(socket_last_error()));

    while(1)
    {
        $acc = socket_accept($s);
        if(!$acc)die(socket_strerror(socket_last_error()));
//      echo "\n".gettype($acc);
        if(!$acc)die(socket_strerror(socket_last_error()));

        while(1)
        {
            $str = socket_read($acc,512);
            $buff.= $str;
            echo $str;
//          echo '::'.gettype($str);

            if($str===false)die(socket_strerror(socket_last_error()));
            if($str=="exit\r\n")break;          
        }

//      if(!socket_shutdown($acc,2))echo socket_strerror(socket_last_error());  
        socket_close($acc);     
        if(preg_match('/exit/',$buff))break;
    }
//echo "\nConnection closed by server\n";   
//if(!socket_shutdown($s,2))echo socket_strerror(socket_last_error());
socket_close($s);
?>

クライアントコード

<?
    set_time_limit(0);
    $f = fsockopen('127.0.0.1',63254,$a,$b,10);
    if(!$f)die('cannot connect');
    echo "\nConnected: \n";
    do{
        $buff = fgets(STDIN);   
        fwrite($f,$buff);
    }while($buff!="exit\r\n");
    fclose($f);
?>

これが十分でない場合は、より良いクライアントサーバーを改善するための提案が必要です。このコードは単なる子供の遊びです。コミュニケーションの仕組みを理解しようとしているだけです。

4

1 に答える 1

0

スタックオーバーの質問回答では、待機状態のポートは接続できないとのことです。

参照している回答はわかりませんが、TIME_WAIT状態のポートにバインドすることはできません。サーバーの場合は、setReuseAddress()を使用してこれを克服できます。クライアントの場合は、待機するか、別のアウトバウンドポートを使用する必要があります。または、何よりも、アウトバウンドポートをまったく指定しない場合は、システムにポートを検出させます。あなたはサーバーなので、これは当てはまりません。

Firefoxブラウザを開いて4つの接続を開きました。私がそれを閉じたとき、それはすべて閉じられ、システムプロセスは2分間の4回の待機を示しました。すべての時間待機は2分間滞在し、消えます。

しかし、それらはクライアントポートです。アウトバウンドポート。サーバーでは、それらはインバウンドポートであり、同じポート番号にリスニングポートもありました。リスニングポートがある限り、インバウンド接続は成功します。

したがって、私が結論付けるのは、接続が閉じるたびに待機時間が発生し、回避できないということです。

TIME_WAITは、あなたが最初にクローズを送信するエンドであるときに発生します。あなたがクローズを受け取り、それに応じてクローズしたエンドである場合、あなたのポートはTIME_WAITにまったく入りません。

于 2010-09-28T09:08:25.683 に答える