套接字程序能够连接到仍在TIME_WAIT的端口

时间:2010-09-28 08:47:14

标签: php-socket

  1. 我写了一个非常简单的套接字服务器。
  2. 在第63254号收听。
  3. 首先我做了一个socket_create,socket_bind,socket_listen所以这里连接正在侦听。
  4. 然后在循环中我执行socket accpet。所以这里另一个听。
  5. 读取函数读取,直到输入退出。
  6. 之后,socket_accept的资源ID关闭。
  7. 然后主连接关闭。
  8. 当我在关闭所有连接后在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);
    ?>
    
    如果这还不够,

    需要建议来改进更好的客户端服务器。这段代码只是一个孩子的游戏。只是想了解沟通的方式。

1 个答案:

答案 0 :(得分:0)

  

在stackover问题答案中是   说不能连接   对于处于等待状态的端口。

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

  

我打开firefox浏览器打开4   连接。当我关闭它的时候   关闭,系统流程显示4   时间等待2分钟。整天   等待2分钟   消失。

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

  

所以我得出的结论是每一个   连接关闭时间等待   发生,无法避免。

发送关闭时,

TIME_WAIT发生。如果您是收到关闭的结束,并且在响应中关闭,则您的端口根本不会进入TIME_WAIT。