2016-08-01 6 views
-1

Я работаю над службой Windows, которая должна собирать все входящие потоки TCP/IP с этим классом. Он запускается из служб OnStart() void.C# TCP/IP не работает должным образом

Однако я столкнулся с тем, что, когда сообщения поступают от второго отправителя , вся связь перестает работать. Затем служба не реагирует на одно соединение, пока вы его не перезапустите.

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

Спасибо, да, я говорю только один порт, но для нескольких конечных точек. – Fabi

ответ

-1

Просто создайте поток, когда вы принимаете какое-либо соединение, поэтому, если он заблокирован, он не будет использоваться для основной программы.

Btw вы можете попробовать AcceptTcpClientAsync, чтобы предотвратить блокировку вызовов.

+0

Нить на соединение не делает масштаб _not_. – CodeCaster

+0

Как мы можем управлять огромным количеством соединений? Использование стеков соединений для обработки? PD: Я просто предложил одно простое решение, а не лучшее. – Raskayu

+1

Вы предложили решение, которое может работать в течение нескольких дней, а затем взорваться в любом реальном сценарии. Это не решение и никому не помогает. См. Например [Опрос тысяч TCP-сокетов] (http://stackoverflow.com/questions/10300428/polling-over-thousands-of-tcp-sockets). – CodeCaster

 Смежные вопросы

  • Нет связанных вопросов^_^