2016-08-01 74 views
-1

Ich arbeite an einem Windows-Dienst, der alle eingehenden TCP/IP-Streams mit dieser Klasse sammeln sollte. Es wird von den Diensten OnStart() void gestartet.C# TCP/IP funktioniert nicht richtig

Allerdings habe ich festgestellt, dass, wenn Nachrichten kommen von einem zweiten Absender, die gesamte Kommunikation funktioniert nicht mehr. Der Dienst reagiert dann nicht auf eine einzelne Verbindung, bis Sie ihn neu starten.

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

      } 

     } 

Kann mir jemand helfen, diese Klasse zu verbessern aus Verbindungen von mehreren Endpunkten, zu beantworten und nicht nach einem besetzt werden?

Vielen Dank im Voraus.

+0

Was passiert, wenn Sie es verfolgen – BugFinder

+2

_ "alle eingehenden TCP/IP-Nachrichten" _ - TCP befasst sich in Streams, nicht Nachrichten. Wenn Sie alle Pakete erfassen möchten, möchten Sie einen Netzwerkfiltertreiber, den Sie in C# nicht ausführen können. – CodeCaster

+0

Danke, und ich spreche nur einen Port, aber für mehrere Endpunkte. – Fabi

Antwort

-1

Erstellen Sie einfach einen Thread, wenn Sie eine Verbindung akzeptieren, also wenn es blockiert wird nicht das Hauptprogramm beeinflussen.

Btw können Sie AcceptTcpClientAsync versuchen, blockieren Anrufe zu verhindern.

+0

Ein Thread pro Verbindung skaliert _nicht_. – CodeCaster

+0

Wie können wir eine große Anzahl von Verbindungen verwalten? Verwenden Sie Stapel von Verbindungen verarbeitet werden? PD: Ich habe gerade eine einfache Lösung vorgeschlagen, nicht die beste. – Raskayu

+1

Sie haben eine Lösung vorgeschlagen, die für ein paar Tage funktionieren könnte und dann spektakulär in jedem realen Szenario explodiert. Das ist keine Lösung und hilft niemandem. Siehe zum Beispiel [Polling über tausende TCP-Sockets] (http://stackoverflow.com/questions/10300428/polling-over-thousands-of-tcp-sockets). – CodeCaster