当我在关闭所有连接后在TCPview中检查此过程时,我仍然可以看到系统进程显示发布63254的TIME_WAIT
如果我再次运行它正在连接的套接字服务器程序,当一个完整的进程结束时,所有连接都关闭并且程序终止,现在我可以看到同一端口的另一个TIME_WAIT。但我仍然可以第三次连接到同一个端口。
在stackover问题答案中,表示无法对处于等待状态的端口进行连接。
我打开firefox浏览器打开了4个连接。 当我关闭它时全部关闭,系统进程显示4次等待2分钟。 所有的时间都等待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);
?>
如果这还不够,需要建议来改进更好的客户端服务器。这段代码只是一个孩子的游戏。只是想了解沟通的方式。
答案 0 :(得分:0)
在stackover问题答案中是 说不能连接 对于处于等待状态的端口。
我不知道你指的是什么答案,但你不能绑定到处于TIME_WAIT状态的端口。如果您是服务器,则可以使用setReuseAddress()来克服此问题。如果您是客户端,您必须等待,或使用不同的出站端口,或者最重要的是根本不指定出站端口,让系统找到一个。您是服务器,因此不适用于您。
我打开firefox浏览器打开4 连接。当我关闭它的时候 关闭,系统流程显示4 时间等待2分钟。整天 等待2分钟 消失。
但那些是客户端端口。出站端口。在您的服务器上,它们是入站端口,并且在同一端口号上还有一个侦听端口。只要有一个侦听端口,入站连接就可以成功。
当发送关闭时,所以我得出的结论是每一个 连接关闭时间等待 发生,无法避免。
TIME_WAIT发生。如果您是收到关闭的结束,并且在响应中关闭,则您的端口根本不会进入TIME_WAIT。