2016-10-12 45 views
1

BeginXXX(AMP)またはXXXAsync(TAP)が.NetFrameworkでIOCPを使用していることはすでに分かっていますが、今はdotnetcoreでhttpServerビルドを構築したいと考えています。私は内部メカニズムを知る必要があります。DotnetCore 1.0.xのTcpListener.BeginAcceptTcpClient I/Oモデルとは

次のコードのような.NetworkFrameworkで私の透水性バージョン:

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

    } 

答えて

0

私は解決しました。 Windowsでは

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

において:

AcceptAsyncが
BeginAcceptでAcceptEx + SafeNativeOverlapped(IOCP)から

リファレンスを使用でAcceptEx + SocketAsyncEventArgs(IOCP)を使用しUnixライクなOS:

AcceptAsyncまたはAcceptAsyncは、ユーザーモードでInterop.Sys.Accept + ThreadPoolを使用します。

から

参考: 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