【问题标题】:HttpListener leaves connections in TIME_WAITHttpListener 在 TIME_WAIT 中留下连接
【发布时间】:2014-03-03 22:48:12
【问题描述】:

我有一个简单的 C# Windows 服务,它应该对端口 8080 上的 GET 请求响应“OK”。 一切正常,只有一个简单的痒......

对服务的每个请求都停留在 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 的本地声明。

【问题讨论】:

  • 4 分钟后呢?那它看起来怎么样? (假设没有新的连接进来)
  • 你有 2 个_listener:方法作用域和类作用域。先修好了。
  • 经过测试,4 分钟后 TIME_WAIT 连接消失。现在有没有办法让它们在 TIME_WAIT 中停留 4 分钟。

标签: c# windows-services httplistener time-wait


【解决方案1】:

感谢rene指出正确的方向...

时间等待 (服务器或客户端)表示等待足够的时间以确保远程 TCP 收到其连接终止请求的确认。 [根据 RFC 793,连接可以在 TIME-WAIT 中停留最多四分钟,称为 MSL(最大分段寿命)。]

对于想要改变这种行为的其他人: TIME_WAIT 周期可通过修改以下 DWORD 注册表设置来配置,该设置以秒为单位表示 TIME_WAIT 周期。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters\TcpTimedWaitDelay

【讨论】:

  • 请注意,该设置的存在是有原因的。如果旧的 TCP 数据到达一个新连接已经使用的端口,肯定会发生混乱。例如,您可能想要更改临时端口的最大数量。并且不要将 TimedWaitDelay 设置为低于 30s 左右,否则在实践中可能会出现很多错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多