2016-07-17 4 views
0

Ich brauche einen Server, der akzeptiert und hält lange viele Verbindungen (perspektivisch über 100k).Viele TcpListener eingehende Verbindungen

Mein Code ist unten:

public delegate Task ClientConnectedEventHandler(Stream stream); 

public class Listener 
{ 
    public event ClientConnectedEventHandler OnClientConnected; 

    private readonly TcpListener _tcpListener; 

    public Listener() 
    { 
     _tcpListener = new TcpListener(new IPEndPoint(IPAddress.Any, 8082)); 
    } 

    public void Start() 
    { 
     _tcpListener.Start(); 
     _tcpListener.BeginAcceptTcpClient(Accept, null); 
    } 

    private void Accept(IAsyncResult asyncResult) 
    { 
     _tcpListener.BeginAcceptTcpClient(Accept, null); 
     var client = _tcpListener.EndAcceptTcpClient(asyncResult); 
     var stream = client.GetStream(); 
     OnClientConnected?.Invoke(stream).ContinueWith(_ => client.Close()); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var listener = new Listener(); 
     var count = 0; 
     var infoLock = new object(); 

     listener.OnClientConnected += async stream => 
     { 
      lock (infoLock) 
      { 
       count++; 
       Console.Title = count.ToString(); 
      } 
      while (true) 
      { 
       // Some logic 
       await Task.Delay(100); 
      } 
     }; 

     listener.Start(); 
     while (true) 
     { 
      Thread.Sleep(100); 
     } 
    } 
} 

Es gibt kein Problem, wenn die Logik auf 300-400 ms in Anspruch nimmt. Aber wenn ich eingehende Verbindungen für eine lange Zeit behalten möchte, Count Variable erhöht sehr langsam nach dem Akzeptieren von 8 Clients, darüber hinaus scheint ein Problem mit großen Speicherverbrauch. Was mache ich falsch und wie löst man das?

+0

Es gibt viel zu lesen: http://smallvoid.com/article/winnt-tcpip-max-limit.html –

Antwort

Verwandte Themen