- 私は非常に単純なソケットサーバーを作成しました。
- ポスト63254でリッスンします。
- 最初にsocket_create、socket_bind、socket_listenを実行したので、ここで接続がリッスンしています。
- 次に、ループでソケットaccpetを実行します。だからここで別の話を聞いてください。
- 読み取り関数は、入力出口まで読み取ります。
- その後、socket_acceptによるリソースIDが閉じます。
- その後、メイン接続が閉じます。
すべての接続を閉じた後、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);
?>
これが十分でない場合は、より良いクライアントサーバーを改善するための提案が必要です。このコードは単なる子供の遊びです。コミュニケーションの仕組みを理解しようとしているだけです。