2011-12-09 161 views
1

我遇到了TCPListener的問題。我在下面創建了這個代碼,它可以與測試應用程序一起工作,但我無法從生產框中獲得連接。在下面的圖片中,您可以看到.44正在不斷嘗試連接,但正如在Console窗口輸出中所看到的,除了Listening Started之外,沒有任何連接被接收到。TCPListener不接受連接

我在忽略什麼?

public class TCPServer 
{ 
    #region Privates 
    private ILog log; 
    private readonly string _connectionString = ""; 
    private readonly List<AgentState> _lAgentState; 
    private readonly DateTime _lastUpdatedRecord = new DateTime(); 
    private readonly TcpClient _tcpClient; 
    private readonly IPEndPoint _serverEndPoint; 
    private int _messageNumber = 2; 
    private TcpListener _tcpListener; 
    private Thread _listenThread; 

    #endregion 

    public IEXHermes() 
    { 
     var methodName = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name; 

     try 
     { 
      log = LogManager.GetLogger("Logger"); 
      log.Info("Class Starting"); 
      _connectionString = Properties.Settings.Default.HN_ConnectionString; 
      _lAgentState = getInitialState(); 
      _lastUpdatedRecord = _lAgentState.Max(w => w.actionLocalTime); 



      Int32 iexPort = Int32.Parse(Properties.Settings.Default.IEX_Port); 
      _tcpListener = new TcpListener(IPAddress.Any, iexPort); 
      log.Debug("Server Open on Server: " + IPAddress.Any); 
      log.Debug("Server Open on Port: " + iexPort); 
      _listenThread = new Thread(listenForClients); 
      _listenThread.Start(); 

     } 
     catch (Exception ex) 
     { 

      log.FatalFormat("{0} - {1} \n {2}", methodName, ex.Message, ex.StackTrace); 
     } 
    } 

    private void listenForClients() 
    { 
     var methodName = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name; 
     log.Debug(methodName + " Starting"); 

     try 
     { 

      log.Debug(methodName + " - Listening Started"); 
      _tcpListener.Start(); 

      while (true) 
      { 
       try 
       { 
        var client = _tcpListener.AcceptSocket(); 
        var clientThread = new Thread(handleClientComm); 
        clientThread.Start(client); 
       } 
       catch (Exception ex) 
       { 
        log.FatalFormat("{0} - {1} \n {2}", methodName, ex.Message, ex.StackTrace); 
       } 

      } 
     } catch (Exception ex) 
     { 
      log.FatalFormat("{0} - {1} \n {2}", methodName, ex.Message, ex.StackTrace); 
     } 
     log.Debug(methodName + ": Listener Closer"); 
    } 

    private void handleClientComm(object client) 
    { 
     var methodName = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name; 
     var tcpClient = (TcpClient)client; 
     log.Debug(methodName + ": New Connection Established"); 
     try 
     { 

      var clientStream = tcpClient.GetStream(); 
      var message = new byte[4096]; 

      while (true) 
      { 
       var bytesRead = 0; 

       try 
       { 
        bytesRead = clientStream.Read(message, 0, 4096); 
       } 
       catch 
       { 
        break; 
       } 

       if (bytesRead == 0) 
       { 
        break; 
       } 

       var encoder = new ASCIIEncoding(); 
       var a = encoder.GetString(message, 0, bytesRead); 
       Console.WriteLine("Recieved: " + a.ToUpper()); 

       if (a.ToUpper().Contains("INIT")) 
       {  
        a = sessionInitialize(); 
       } 
        tcpClient.Client.Send(Encoding.UTF8.GetBytes(a)); 

       Console.WriteLine("Sent: " + a); 

      } 


     } 
     catch (Exception ex) 
     { 
      log.FatalFormat("{0} - {1} \n {2}", methodName, ex.Message, ex.StackTrace); 
     } 
     finally 
     { 
      tcpClient.Close(); 
     } 
    } 
} 

Wireshark Capture

+1

如果你可以在本地連接,它很可能是一個網絡問題 - 你有防火牆可以阻止它嗎? – NibblyPig

+1

我不這麼認爲,Wireshark圖像顯示從.44 –

+0

Jason嘗試連接,我假設wireshark圖像在客戶端上?生產箱可能會阻塞端口44,所以它會顯示客戶端上的嘗試,但服務器永遠不會知道嘗試已經完成。 –

回答

0

也許嘗試至少爲測試目的的真實IP更換IPAddress.Any,只是要確定...

+0

有趣的一點在這裏,我試過並且出現錯誤「通常只允許每個套接字地址(協議/網絡地址/端口)的一個用法」 –

+0

因此,您要在端口上創建一個套接字(TCPListener)已在使用中。要麼多次調用IEXHermes(這不會顯示在您的代碼中),或者您有另一個應用程序使用相同的端口。 – puikos

+0

這最終導致我找到答案,這是一個錯誤配置的網卡。 –