2010-12-13 3 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

"?? % ??" 기호는 텔넷 옵션 IAC 때문입니다. IAC에 대한 255 추가 정보보다 큰 소수 코드는 IAC 값의 문제는 당신이하려고 할 때이다

support.microsoft.com/kb/231866

주소에서 도달 할 수있는 응답 값을 IAC는 것처럼 반환 C#하여 TcpClient 코드는 IAC 값은 수신 된 상기 "?? %"값을 생성하는 코드를 STANDART

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

를 사용하여 함께 응답을 분석.

이 문제를 방지하고 IAC 값을 처리하기 위해 IEA 값을 완벽하게 처리하는 http://www.codeproject.com/KB/IP/TelnetSocket.aspx 주소의 훌륭한 텔넷 프로젝트를 발견했습니다.

IAC 값 처리에 대한 이해를 돕기 위해 MinimalisticTelnet 라이브러리의 소스 코드가 유용 할 것입니다. MinimalisticTelnet을 사용하여 문제없이 응답을 얻을 수 있었지만 작업중인 장치에 대한 메시지를 보낼 때 실패하여 텔넷 소켓 프로젝트를 선호했습니다. 그러나 더 나은 이해를 위해 MinimalisticTelnet 소스 코드를 연구 할 것을 강력하게 제안합니다.

관련 문제