2017-10-09 10 views
2

私は、TCP接続を受け入れ、サーバーに送信されたデータを処理し、プロセスが完了したというメッセージを返すWindowsサービスを作成しています。サービスに接続するクライアントがいくつかあり、その数が増えています。これらのメッセージを処理するには、ノンブロッキング構造を使用することが理想的だと思いました。最初の検索から、BeginAcceptTcpClientが私が探していたようでした。私はサンプルを取得するためにat this tutorialを見ていたが、私はこれがどのように動作するかについていくつか質問がある。この例に基づいている私のコードは以下の通りです。begin/async tcplistenerはどのように動作するのですか?

  1. OnClientConnectedの機能では、なぜWaitForClientsに再度電話する必要がありますか?リスナーはいつも聞いていないのですか?
  2. WaitForClientsが再度呼び出される前に別の接続が試行されるとどうなりますか?私はそれがOnClientConnectedの最初のステートメントであることを知っていますが、同時に2つの接続が発生する可能性があります。
  3. これはマルチスレッドに関してどのように動作するのか分かりません。シミュレーション接続が10個ある場合は、最初にOnClientConnectedと入力し、次にWaitForClientsと入力すると、別の接続を処理できるようになります。これは、多くのトラフィックを処理できる複数のスレッドを持つのではなく、一度に1つの接続というように見えます。

public class DeviceListener 
{ 
    private TcpListener listener = null; 

    public DeviceListener() 
    { 
     listener = new TcpListener(1001); 
    } 

    public void StartListener() 
    { 
     listener.Start(); 
     //TODO: Log listening started here 
     WaitForClients(); 
    } 

    private void WaitForClients() 
    { 
     listener.BeginAcceptTcpClient(OnClientConnected, null); 
    } 

    private void OnClientConnected(IAsyncResult asyncResult) 
    { 
     WaitForClients(); 
     TcpClient client = listener.EndAcceptTcpClient(asyncResult); 

     if(client != null) 
     { 
      //TODO: Log connected 
      HandleClientRequest(client); 
     } 
    } 

    private void HandleClientRequest(TcpClient client) 
    { 
     //Code to process client request 
    } 
} 

答えて

2
  1. いいえ、それはBeginAcceptTcpClientの呼び出しと正確に同じ数の接続を受け入れるので、あなたは再びBeginAcceptTcpClientを呼び出す必要が別のものを受け入れるためです。ハンドラの初めはそうするための合理的な場所のようです。
  2. BeginAcceptTcpClientへの次の呼び出しでキューに入れられ、処理されるか、タイムリーに発生しない場合はタイムアウトになります。
  3. Please refer to the docsこれらは、ThreadPoolを使用して実行される可能性が最も高いです。
関連する問題