2016-08-01 63 views
-1

我正在研究應該收集所有傳入的TCP/IP流與這個類的Windows服務。它從服務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

只要在接受某個連接時創建一個線程,那麼如果它被阻止將不會影響主程序。

順便說一句,你可以嘗試AcceptTcpClientAsync以防止阻止呼叫。

+0

每個連接的線程不會縮放。 – CodeCaster

+0

我們如何管理大量的連接?使用堆棧連接進行處理? PD:我剛剛提出了一個簡單的解決方案,而不是最好的。 – Raskayu

+1

您提出了一個可能會工作幾天的解決方案,然後在任何現實生活場景中大放異彩。這不是一個解決方案,並不會幫助任何人。請參閱例如[輪詢數千個TCP套接字](http://stackoverflow.com/questions/10300428/polling-over-thousands-of-tcp-sockets)。 – CodeCaster