2009-03-30 3 views
1

TcpClient 클래스를 사용하여 텔넷 연결을 구현합니다. 내가 모르는 것은 응답의 끝을 결정하는 방법입니다. 일단 DataAvailable 속성이 true가되면, 스트림에서 데이터를 읽은 다음 DataAvailable을 일시적으로 false로 설정하고 버퍼가 다른 데이터 청크로 채워지지만 모든 데이터가 읽혀지고 사라지는 것 같습니다. 모든 응답을 읽었는지 어떻게 확인합니까?프로그래밍 방식으로 텔넷 연결 지연을 처리하는 방법은 무엇입니까?

올바르게 작동하려면 아래의 코드 스 니펫을 변경하는 방법을 알려주세요. 전체 응답을 검색 할 시간이 충분하기 때문에 코드를 단계별로 실행할 때 올바르게 작동합니다. 당신의 도움을 주셔서 감사합니다.

if (this.Stream.DataAvailable) 
{ 
    readBuffer = new Byte[this.Client.ReceiveBufferSize]; 
    do 
    { 
     // read data 
     bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length); 
     Thread.Sleep(10); 
     responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString(readBuffer, 0, bytes)); 

     } while (this.Stream.DataAvailable); 

     allDataRead = true; 
     break; 
} 

답변

2

텔넷과 같은 응용 프로그램의 경우 TCP 연결을 사용하면 전송의 끝과 같은 개념이 없습니다. 사용자가 입력 할 때 각 키를 한 번에 하나씩 보내는 텔넷 클라이언트를 종종 볼 수 있으며 일반적으로 줄 바꿈을받을 때 조치를 취하는시기는 서버에 달려 있습니다. 다른 클라이언트는 몇 가지 클라이언트 키 누름을 버퍼링하여 한꺼번에 보낼 수 있습니다.

앱의 외모로 보면 전송 끝을 알 수있는 줄 넘김을 찾아야합니다.

do  
{  
    bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);    
    responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString (readBuffer, 0, bytes));  
} while (this.Stream.DataAvailable && !responseData.Contains("\n"));  
0

이 용도로 DataAvailable을 사용하는 것은 좋지 않습니다. 응답의 끝은 프로토콜이 말하는대로입니다.

Read와 같은 차단 호출을 사용하여 물건을 읽은 다음 설정 한 프로토콜을 사용하여 더 읽고 더 많이 확인하는 것이 좋습니다. 모든 데이터를 읽을 때 Read가 반환되지 않지만 일부 데이터가 읽혀지면 읽은 값을 확인해야하기 때문에 원하는 모든 데이터가 반환되지 않을 수도 있습니다.

프로토콜이 텔넷 인 경우 수신하려는 모든 단일 바이트에 응답 할 가능성이 높습니다. 터미널을 에코하거나 명령을 처리하거나 그렇지 않은 경우처럼 응답해야합니다.

DataAvailable은 호출 할 때 읽기가 차단되는지 (버퍼에있는 값과 함께 반환됩니다) 확인하는 데 적합하지만 루프가 단순하지는 않습니다.

0

실제 텔넷 연결입니까? 즉, 텔넷 서버에 연결하고 있습니까, 아니면 'telnet'입니까? 'TCP/IP 소켓'입니까?

먼저 전송이 완료되면 서버가 연결을 끊을 지 여부를 결정하십시오. 그렇다면 스트림의 끝까지 읽을 수 있습니다. 그렇지 않은 경우, 읽기가 완료되었는지 여부를 결정하기 위해 데이터에서 큐를 사용해야합니다. 이와 관련하여 여러 가지 프로토콜이 서로 다른 방식으로 작동합니다. 따라서 우리가 프로토콜에 대해 깨우칠 수 있다면 더 직접적인 답을 줄 수 있습니다. 접근법은 일반적으로 응답의 시작 부분에 바이트/문자 수 (수신기는 단순히 많은 바이트/문자를 읽음) 또는 응답의 끝을 구분하는 마커를 사용하여 두 개의 진영으로 나뉩니다 (수신자는 수신 할 때까지 읽습니다. 구분 기호).

+0

tcp/ip 소켓과 포트 23을 사용하는 텔넷 서버에 대한 연결입니다. 서버가 연결을 종료하지 않습니다. 텔넷 세션의 첫 번째 부분은 서버가 첫 번째 사용자 이름을 묻고 암호를 묻는 경우의 인증입니다. 구분 기호를 확인하고 나중에 알려 드리겠습니다. 고맙습니다. – David

+0

유닉스/BSD/Windows/etc에서 텔넷 서버가 콘솔 세션이라고 가정합니다. 명령 프롬프트 텍스트를 구분 기호로 사용할 수 있습니다. –

관련 문제