0
  1. I have written a very simple socket server.
  2. It listens in post 63254.
  3. First i did a socket_create, socket_bind, socket_listen so here a connection is listening.
  4. Then in a loop i do the socket accpet. so here another listen.
  5. the read function reads untill i input exit.
  6. after that the resource id by socket_accept closes.
  7. and then the main connection closes.

when i checked this process in TCPview after closing all connections i can still see the system process showing TIME_WAIT for post 63254

if i again run the socket server program it is connecting and when one full process is over all the connection is closed and the program terminated and now i can see another TIME_WAIT for the same port. but still i could connect to the same port the third time.

in stackover question answer it is said that connection cannot be done for port which is in wait state.

I opened firefox browser it opened 4 connections. when i closed it all closed and the system process showed 4 time waits for 2 minutes. all time wait stays for 2 minutes and disappears.

so what i conclude is for every connection close the time wait is occurs and cannot be avoided.

i read many posts in stack overflow flow but still wasn't sure of it.

i run the following code in command line.

My server Code

<?
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);
?>

The client code

<?
    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);
?>

need suggestions to improve a better client server if this is not sufficient. this code is just a child's play. just trying to understand the way communication works.

4

1 回答 1

0

在stackover question answer中,据说无法为处于等待状态的端口完成连接。

我不知道您指的是什么答案,但是您不能绑定到处于 TIME_WAIT 状态的端口。如果你是服务器,你可以使用 setReuseAddress() 来克服这个问题。如果您是客户端,则必须等待,或者使用不同的出站端口,或者最好根本不指定出站端口,让系统找到一个。您是服务器,因此这不适用于您。

我打开Firefox浏览器它打开了4个连接。当我关闭它时,它全部关闭,系统进程显示 4 次等待 2 分钟。所有时间等待停留 2 分钟然后消失。

但这些是客户端端口。出站端口。在您的服务器上,它们是入站端口,并且在同一端口号上还有一个侦听端口。只要有监听端口,入站连接就可以成功。

所以我的结论是每次连接关闭都会发生等待时间并且无法避免。

TIME_WAIT 发生在您是最先发送关闭的一方时。如果您是收到关闭并作为响应关闭的一端,则您的端口根本不会进入 TIME_WAIT。

于 2010-09-28T09:08:25.683 回答