2010-04-16 43 views
1

如何知道何时关闭HTTP客户端的套接字(我的意思是一个浏览器连接到我的TCP套接字服务器)。一切都很完美,但在其他浏览器显示服务器已发送什么,我必须关闭服务器(或调用socket.Close())。如何知道在处理HTTP客户端时何时关闭套接字?

它工作正常,如果我打电话(socket.Close()),但我只是不知道什么时候。我不想在请求中间调用close,否则浏览器将不得不重新连接到服务器。

+0

它是如何,你不知道什么时候你写完响应? – 2010-04-16 02:22:02

+0

LOL是真实的,但在响应结束时关闭是否安全?未决消息呢? – 2010-04-16 02:37:13

回答

3

您需要关闭套接字的末端,以便客户端知道不会有更多的数据。您还需要读取任何未完成的数据,因为如果立即致电Close(),客户端将收到重置(TCP RST)。

有了上面的代码,一旦客户端关闭了它的结束或者你定义的超时时间到了,连接最终会在我们结束时关闭。

我做了很久以前请问这个(为Mono's ASP.NET server):

void LingeringClose() 
    { 
     int waited = 0; 

     if (!Connected) 
      return; 

     try { 
      Socket.Shutdown (SocketShutdown.Send); 
      DateTime start = DateTime.UtcNow; 
      while (waited < max_useconds_to_linger) { 
       int nread = 0; 
       try { 
        if (!Socket.Poll (useconds_to_linger, SelectMode.SelectRead)) 
         break; 

        if (buffer == null) 
         buffer = new byte [512]; 

        nread = Socket.Receive (buffer, 0, buffer.Length, 0); 
       } catch { } 

       if (nread == 0) 
        break; 

       waited += (int) (DateTime.UtcNow - start).TotalMilliseconds * 1000; 
      } 
     } catch { 
      // ignore - we don't care, we're closing anyway 
     } 
    } 
+0

这将工作,即使我有一个异步的基本套接字,因为我可以通过一个新的引用套接字关闭或我将不得不创建一个套接字客户端列表来测试和执行关机? – 2010-04-16 02:57:13

+0

我得到一个错误,说:试图对已关闭的套接字进行尝试?... – 2010-04-16 04:23:53

+0

上述代码用于NetworkStream派生类,并在明确调用Close()或GC完成对象。如果套接字是异步的,你可能需要做一些改变。 – Gonzalo 2010-04-16 20:49:29

1

HTTP是相当复杂的协议。 RFC 2616(你需要必须读取,如果你正在实现一个HTTP服务器)定义1.1版本,并在第8部分具体谈论连接处理。

相关问题