2010-04-16 70 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部分具體談論連接處理。

相關問題