2016-10-12 2 views
1

Je connais déjà le langage IOCP BeginXXX (AMP) ou XXXAsync (TAP) dans .NetFramework, alors maintenant je veux construire le serveur httpServer sur dotnetcore. donc j'ai besoin de connaître le mécanisme interne.Qu'est-ce que le modèle d'E/S TcpListener.BeginAcceptTcpClient dans DotnetCore 1.0.x

Ma version en .NetworkFramework comme drainant le code de suivi:

private void continueAccept(TcpListener tcpListener,Action<TcpClient> processConnection) 
    { 

     //IOCP 
     tcpListener.BeginAcceptTcpClient(ar => 
     { 

      if (listening) 
       continueAccept(tcpListener, processConnection); 
      else 
       return; 

      try 
      { 

       TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar); 

       acceptCount++; 

       tcpClient.SendTimeout = 300000; 
       tcpClient.ReceiveTimeout = 300000; 

       ConsoleHost1.trace(System.Diagnostics.TraceEventType.Verbose, $"Client Accept { tcpClient.Client.RemoteEndPoint.ToString()}"); 

       ThreadPool.QueueUserWorkItem((o) => { 

        processConnection((TcpClient)o); 

       }, tcpClient); 

      } 
      catch (Exception e) 
      { 
       ConsoleHost1.trace(System.Diagnostics.TraceEventType.Error, $"acceptTD:{e.Message}"); 
      } 

     }, null); 

    } 

    public void startListen(Action<TcpClient> processConnection) 
    { 

     tcpListener = new TcpListener(IPAddress.Parse("0.0.0.0"), port1); 
     tcpListener.Start(maxQueue1); 
     listening = true; 

     continueAccept(tcpListener, processConnection); 

    } 

Répondre

0

Je viens de résoudre.

Dans les fenêtres:

AcceptAsync utiliser les AcceptEx + SocketAsyncEventArgs (IOCP)
BeginAccept utiliser le AcceptEx + SafeNativeOverlapped (IOCP)

Référence de: https://github.com/dotnet/corefx/blob/release/1.0.0/src/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs https://github.com/dotnet/corefx/blob/release/1.0.0/src/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs

En Système d'exploitation de type Unix:

AcceptAsync ou AcceptAsync utilisent Interop.Sys.Accept + ThreadPool en mode utilisateur.

Référence de: https://github.com/dotnet/corefx/blob/release/1.0.0/src/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs https://github.com/dotnet/corefx/blob/release/1.0.0/src/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs