2016-08-01 4 views
-1

私は、このクラスのすべての受信TCP/IPストリームを収集するWindowsサービスを開発中です。サービスOnStart()voidから開始されます。C#TCP/IPが正しく動作しません。

しかし、メッセージがの第2の送信者から届くと、通信全体が停止します。サービスは、再起動するまで、単一の接続に反応しません。

public class TCPIP 
{ 

    public static Receiver rc = new Receiver(); 

    public class Receiver 
    { 

     public delegate void ReceivedEventHandler(string ReceivedText, string Sender); 

     public event ReceivedEventHandler Received; 

     public void Start() 
     { 

      System.Threading.Thread th = new System.Threading.Thread(internals); 
      th.Start(); 
     } 

     private void internals() 
     { 

      TcpListener _listener = new TcpListener(1994); 
      _listener.Start(); 

      while (true) 
      { 

       TcpClient rcclient = _listener.AcceptTcpClient(); 
       StreamReader reader = new StreamReader(rcclient.GetStream()); 

       string msg = ""; 

       while (reader.Peek() > -1) 
       { 
        msg += Convert.ToChar(reader.Read()).ToString(); 
       } 

       Received(msg, rcclient.Client.RemoteEndPoint.ToString().Split(Convert.ToChar(":"))[0]); 

       // Cleanup 
       rcclient.Close(); 
       reader.Close(); 

      } 

     } 

誰もが、一つの後に占有されないようにする複数のエンドポイントからの接続に答えるために、このクラスを改善し、私を助けてもらえますか?

ありがとうございます。

+0

トレースするとどうなりますか – BugFinder

+2

_「受信したすべてのTCP/IPメッセージ」_ - TCPはメッセージではなくストリームを処理します。とにかく、すべてのパケットをキャプチャする場合は、C#で行うことができないネットワークフィルタドライバが必要です。 – CodeCaster

+0

ありがとう、そしてええ、私は1つのポートを話しているだけですが、複数のエンドポイントについて話しています。 – Fabi

答えて

-1

何らかの接続を受け入れるときにスレッドを作成するだけです。ブロックされていると、メインプログラムが実行されません。

Btwを試すと、コールをブロックしないようにAcceptTcpClientAsyncを試すことができます。

+0

1接続あたりのスレッドは_not_スケールではありません。 – CodeCaster

+0

膨大な接続をどのように管理できますか?処理される接続のスタックを使用しますか? PD:単なる単純な解決策を提案しましたが、最適ではありません。 – Raskayu

+1

あなたは数日間働く可能性のあるソリューションを提案し、実際のシナリオでは爆発的に爆発的に爆発するでしょう。それは解決策ではなく、誰にも役立たない。たとえば、[何千ものTCPソケットのポーリング](http://stackoverflow.com/questions/10300428/polling-over-thousands-of-tcp-sockets)を参照してください。 – CodeCaster

関連する問題