Обработка нескольких соединений в ядре TCP Server dot net - PullRequest
0 голосов
/ 21 марта 2020

У меня есть следующий код:

public abstract class TcpServer
{
    int numberOfListeners = 20;

    protected TcpListener listener;

    public TcpServer(IPEndPoint endPoint)
    {
        listener = new TcpListener(endPoint);
        listener.Start();
        //Not sure if this is correct, did it to ensure there are plenty listeners prompt
        for (int i = 0; i < numberOfListeners; i++)
        {
            BeginAcceptTcpClient();
        }
    }

    protected abstract void ListenerCallBack(IAsyncResult ar);

    protected void BeginAcceptTcpClient()
    {
        listener.BeginAcceptTcpClient(ListenerCallBack, null);
    }
}

И реализация

public class SimpleWebServer : TcpServer
{
    public SimpleWebServer(IPEndPoint endPoint) : base(endPoint)
    {
    }

    protected override void ListenerCallBack(IAsyncResult ar)
    {
        //Not sure if this is the proper way of handling multiple connections, in my tests it worked like a charm
        BeginAcceptTcpClient();

        var client = listener.EndAcceptTcpClient(ar);

        Stream outputStream = client.GetStream();

        StreamReader sr = null;

        try
        {
            sr = new StreamReader(outputStream);
            HandleRequest(sr,outputStream);
        }
        catch
        {
           //something went wrong
        }

        sr?.Dispose();
        outputStream.Dispose();
        client.Dispose();
    }
}

Сначала это работает нормально, но в конце концов (точного времени я бы не сказал несколько часов безотказной работы) сервер перестает отвечать (как если бы пул сокетов был исчерпан). И кажется, что потоки обработчика спят (я измерил время запроса / ответа, оно увеличивается, если сервер простаивает).

  • Это правильный способ обработки нескольких запросов?
  • Есть ли что-то, что я могу сделать, чтобы улучшить "быстроту" сокетов?
  • Есть ли у AcceptTcpClient () тайм-аут? (не нашел)

Большое спасибо!

...