2012-10-07 56 views
0

我正在處理一個http代理應用程序,一切工作正常(客戶端可以連接到服務器並獲取內容),問題是既不是HTTP服務器或瀏覽器關閉TCP連接..我不是如果知道我在做是正確的,這裏是代碼:c#Socket Closing

while (tcp_link.Connected && _tcp.Connected && !ioError) 
{ 
    try 
    { 
     Thread.Sleep(100); 
     if (streamLink.DataAvailable) 
     { 
      byte[] l_buffer = new byte[10000]; 
      int l_read = streamLink.Read(l_buffer, 0, l_buffer.Length); 
      byte[] l_data = new byte[l_read]; 
      Array.Copy(l_buffer, l_data, l_data.Length); 

      _stream.Write(l_data, 0, l_data.Length); 
     } 

     if (_stream.DataAvailable) 
     { 
      byte[] c_buffer = new byte[10500]; 
      int c_read = _stream.Read(c_buffer, 0, c_buffer.Length); 
      byte[] c_data = new byte[c_read]; 
      Array.Copy(c_buffer, c_data, c_data.Length); 

      streamLink.Write(c_data, 0, c_data.Length); 
     } 
    } 
    catch 
    { 
     ioError = true; 
    } 
} 

我有相同的代碼雙方(代理客戶端和代理服務器)

注:瀏覽器將連接到代理客戶端(這是在同一臺計算機上),並且代理客戶端將連接到代理服務器,顯然代理服務器將連接到http服務器,原因是我不想在發送數據之前編碼數據

+0

你可以考慮用socket.Available初始化byte []。這段代碼並沒有給出你想要活躍的想法 – ray

回答

1

你觀察到連接打開了多久?

默認情況下,客戶端很可能使用HTTP 1.1,其中持續連接處於打開狀態。

如果你正在寫一個代理,那麼你應該考慮:http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

+0

我使用網絡監控工具,當瀏覽器直接連接到http服務器時,連接在數據被接收後立即關閉,所以它意味着瀏覽器或http服務器將關閉連接,但是當瀏覽器連接到代理服務器端時,我無法從代理服務器端的http服務器檢測到任何關閉請求 –

1

好吧,我發現了問題,誰曾在那裏與關閉套接字連接有問題..

其實,Socket.Available不工作如我所料,看有沒有插座真的連你應該檢查可用和投票性質,以下功能應該可以解決你的問題:thanks to: zendar

bool SocketConnected(Socket s) 
{ 
     bool part1 = s.Poll(1000, SelectMode.SelectRead); 
     bool part2 = (s.Available == 0); 
     if (part1 & part2) 
      return false; 
     else 
      return true; 
} 

我希望這也能解決你的問題;)