2010-12-13 34 views
0

目前我正在開發一個網絡項目,其中包括連接到tcp服務器和一些設備。很長一段時間,我成功地使用了下面的代碼來發送tcp命令並接收某些設備模型的響應,但是當我嘗試使用Windows Telnet Server 2003和Fortigate設備時,即使我可以成功建立tcp連接,我仍然可以獲得響應有些字符集像??%??????'。c#TcpClient無法從成功連接的遠程登錄服務器/設備讀取有效響應

我的用於接收響應函數是:

private string receive() 
    { 
     StringBuilder sbReadBuffer = new StringBuilder(); 
     bool isFinished = false; 
     NetworkStream ns = tcpClient.GetStream(); 
     DateTime lastConTime = DateTime.Now; 

     while (!isFinished) 
     { 
      if (!ns.DataAvailable) 
      { 
       Thread.Sleep(200); 

       if ((DateTime.Now - lastConTime).TotalSeconds > Prms.tcpSendReceiveTimeoutInSeconds) 
        break; 
       else 
        continue; 
      } 

      Int32 receiveCount = ns.Read(receiveBuffer, 0, receiveBuffer.Length); 
      String received = new ASCIIEncoding().GetString(receiveBuffer, 0, receiveCount); 

      sbReadBuffer.Append(received); 

      foreach (String terminaterToken in terminaterTokens) 
       if (sbReadBuffer.ToString().EndsWith(terminaterToken)) 
        isFinished = true; 

      lastConTime = DateTime.Now; 
     } 

     return sbReadBuffer.ToString(); 
    } 
} 

和建立TCP連接,並調用接收功能:

 TcpClient tcpClient = new TcpClient() 
    { 
     SendTimeout = 10000, 
     ReceiveTimeout = 10000 
    }; 

    tcpClient.Connect(wanIp, 23); 
    String initialMessage = receive(); 

我測試接收到的消息的裝置,其上面的代碼工作沒有問題,並我意識到,對於每種不同的設備型號,最初的響應總是像「??%??????'????」但隨後像「歡迎」與

邏輯的反應在我的測試中,我發現了程序連接到服務器/設備成功,但不能接收到有效的迴應,我不知道爲什麼。對此有何想法?

回答

1

導致「??%?? ??」的問題符號是因爲telnet選項IAC。返回的響應值作爲IAC已超過255約IAC更多信息更大的十進制代碼可以從地址到達

support.microsoft.com/kb/231866

與IAC值的問題是,當你嘗試解析用C#TcpClient的使用非標準代碼

  byte[] sendBuffer = new ASCIIEncoding().GetBytes(str + strNewLine); 
      tcpClient.GetStream().Write(sendBuffer, 0, sendBuffer.Length); 

代碼產生上面的「??%」時收到IAC值的值的響應。

爲了防止這種情況並處理IAC值,我做了一些研究,並在地址http://www.codeproject.com/KB/IP/TelnetSocket.aspx上找到了一個很好的telnet項目,它完美地處理了IAC值。

爲了更好地理解處理IAC值還要檢查MinimalisticTelnet庫的源代碼將很有用。使用MinimalisticTelnet,我能夠毫無問題地得到響應,但是因爲我工作的設備發送消息失敗,所以我更喜歡telnet套接字項目。但我強烈建議研究MinimalisticTelnet源代碼以獲得更好的理解。

相關問題