【发布时间】:2010-09-28 21:36:52
【问题描述】:
- 我写了一个非常简单的socket服务器。
- 它在 63254 后监听。
- 首先我做了一个socket_create、socket_bind、socket_listen,所以这里有一个连接正在监听。
- 然后在一个循环中我做套接字accpet。所以这里再听一听。
- read 函数读取直到我输入退出。
- socket_accept 的资源 id 关闭之后。
- 然后主连接关闭。
当我在关闭所有连接后在 TCPview 中检查此进程时,我仍然可以看到系统进程显示 TIME_WAIT for post 63254
如果我再次运行它正在连接的套接字服务器程序,并且当一个完整进程结束时,所有连接都将关闭并且程序终止,现在我可以看到同一端口的另一个 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);
?>
如果这还不够,需要改进更好的客户端服务器的建议。这段代码只是儿戏。只是想了解沟通的运作方式。
【问题讨论】:
标签: php-socket