프로그래밍 방식으로 텔넷 연결 지연을 처리하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/697385

문제

TCPClient 클래스를 사용하여 텔넷 연결을 구현합니다. 내가 모르는 것은 응답의 끝을 결정하는 방법입니다. DataaAvailable 속성이 사실이되면 스트림의 데이터를 읽고 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;
}
도움이 되었습니까?

해결책

Telnet과 같은 응용 프로그램에 대한 TCP 연결을 사용하면 전송 끝과 같은 개념이 없습니다. 사용자가 입력 할 때 각 키 프레스를 한 번에 하나씩 보내는 Telnet 클라이언트를 찾을 수 있으며 일반적으로 라인 피드를받을 때 조치를 취할시기를 결정하는 것은 서버에 달려 있습니다. 다른 클라이언트는 몇 가지 클라이언트 키 프레스를 버퍼링하여 한 번에 모두 보낼 수 있습니다.

앱의 외관에 따라 전송 끝을 나타내는 라인 피드를 찾아야합니다.

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"));       

다른 팁

이 목적으로 데이터를 사용할 수있는 것이 좋은 생각이라고 생각하지 않습니다. 응답의 끝은 프로토콜이 말하는 것입니다.

읽기와 같은 차단 통화를 사용하여 내용을 읽고, 설정 한 프로토콜을 사용하여 더 읽기 위해 결정하는 것이 좋습니다. 모든 데이터를 읽을 때 읽기가 반환되지 않고 일부 데이터를 읽을 때 읽기가 반환되지 않기 때문에 원하는 모든 데이터가 반환되는 것은 아닙니다. 따라서 읽은 양을 확인해야합니다.

프로토콜이 Telnet 인 경우, ECHO IT 또는 프로세스 명령 또는 그렇지 않은 터미널과 마찬가지로 수신 된 모든 바이트에 응답 할 수 있습니다.

DataAvailable은 호출 할 때 읽기가 차단 될지 확인하는 데 적합하지만 (버퍼에있는 모든 것과 함께 돌아옵니다) 루프를 덜 간단하게 만듭니다.

이것이 실제 텔넷 연결입니까, 즉 텔넷 서버에 연결하고 있습니까?

먼저 전송이 완료되면 서버가 연결을 삭제하는지 여부를 결정하십시오. 그렇다면 스트림이 끝날 때까지 간단히 읽을 수 있습니다. 그렇지 않으면 읽기가 완료되었는지 여부를 결정하기 위해 데이터에서 큐를 사용해야합니다. 다른 프로토콜은 이와 관련하여 다른 방식으로 작동하므로 프로토콜에 우리를 깨달을 수 있다면보다 직접적인 답변을 줄 수 있습니다. 접근 방식은 일반적으로 두 캠프에 속합니다. 응답 시작 부분에 바이트/문자 수를 포함하여 (수신기는 단순히 많은 바이트/문자를 읽음) 마커를 사용하여 응답의 끝을 구분하기 위해 마커를 사용합니다 (수신기가 수신 할 때까지 수신자가 읽습니다. 구분 기).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top