2014-03-03 137 views
0

我有一個簡單的C#Windows服務應該作出迴應「OK」來獲得對端口的請求8080 一切正常,一個簡單的癢......HttpListener葉TIME_WAIT連接

到由每一個請求服務停留在TIME_WAIT。 我是否錯過了一些東西,我環顧四周,大多數我在HTTPListeners和Windows服務上看到的樣本都是以類似的方式做的?

private HttpListener _listener; 

    protected override void OnStart(string[] args) 
    { 
     _listener = new HttpListener(); 
     _listener.Prefixes.Add("http://*:8080/"); 
     _listener.Start(); 
     _listener.BeginGetContext(new AsyncCallback(OnRequestReceive), _listener); 
    } 

    protected override void OnStop() 
    { 
     _listener.Stop(); 
    } 

    private void OnRequestReceive(IAsyncResult result) 
    { 
     if (!_listener.IsListening) 
      return; 

     //Get context for a request. 
     HttpListenerContext context = _listener.EndGetContext(result); 
     HttpListenerRequest request = context.Request; 

     //Obtain a response object. 
     HttpListenerResponse response = context.Response; 
     response.ContentType = "application/json"; 
     response.KeepAlive = false; 

     //Our return message... 
     string responseString = "OK"; 

     //Construct the response. 
     byte[] buffer = Encoding.UTF8.GetBytes(responseString); 

     Stream output = response.OutputStream; 
     response.ContentLength64 = buffer.Length; 
     output.Write(buffer, 0, buffer.Length); 

     //Close and send response 
     try 
     { 
      output.Flush(); 
      output.Close(); 
      response.Close(); 
     } 
     finally 
     { 
      //Wait for another request 
      _listener.BeginGetContext(new AsyncCallback(OnRequestReceive), _listener); 
     } 
    }  

編輯:固定_listener的本地聲明。

+0

而4分鐘後?它看起來如何? (假設沒有新的連接進來) – rene

+1

你有2個'_listener':方法作用域和類作用域。先修復它。 – abatishchev

+1

經過測試,4分鐘後TIME_WAIT連接消失。現在有辦法讓他們在TIME_WAIT停留4分鐘。 – Eramas

回答

0

感謝劉若英您指出正確的方向...

TIME-WAIT (無論是服務器還是客戶端)代表等待足夠的時間來傳遞,以確保遠程TCP接收到它的連接終止確認請求。 [根據RFC 793的連接可以留在TIME-WAIT最多的被稱爲MSL4分鐘(最大段生存期)。]

對於別人誰想要改變這種行爲: 的TIME_WAIT期間可配置通過修改以下代表TIME_WAIT時間段的DWORD註冊表設置(以秒爲單位)。

HKEY_LOCAL_MACHINE \系統\ CurrentControlSet \服務\ TCPIP \參數\ TcpTimedWaitDelay的

+1

請注意,該設置是有原因的,但。如果舊的TCP數據到達一個已經被新連接使用的端口,就會發生混淆。例如,您可能想改變臨時端口的最大數量。並且不要將TimedWaitDelay設置爲低於30秒左右,否則在練習中可能會出現很多錯誤。 – Luaan

+0

除了Luaan的評論之外,另請參閱[TIME_WAIT上的討論及其對繁忙服務器的影響](http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/)。 – CodeFox