2016-07-17 3 views
0

을 수락하고 오랜 시간 동안 (100,000 이상) 연결을 유지하는 서버를 만들어야합니다.많은 TcpListener 들어오는 연결

내 코드는 다음과 같습니다 : 논리가 300-400 MS에 차지하는 경우

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); 
     } 
    } 
} 

아무 문제가 없습니다. 그러나 오랫동안 들어오는 연결을 유지하려는 경우 카운트 변수가 8 클라이언트를 수락 한 후에 매우 느리게 증가하며 거대한 메모리 사용 문제가 나타납니다. 내가 뭘 잘못하고 어떻게 해결할 수 있습니까?

+0

읽을 거리가 많습니다. http://smallvoid.com/article/winnt-tcpip-max-limit.html –

답변