텔넷 스트림에서 큰 바이트 어레이로 읽는 바이트 배열이 가득 찰 때까지 기다리나요?

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

  •  03-07-2019
  •  | 
  •  

문제

여기서 몇 가지 질문과 답변을 읽음으로써 텔넷 스트림이 실제로 닫히지 않는 것 같습니다. DataAvailable ()을 사용하면 반환되지 않습니다.

완료하는 데 매우 오랜 시간이 걸린 코드를 물려 받았으며 문제가되는 텔넷 서버라고 생각했습니다. 그러나 코드가 Telnet 서버의 응답을 저장하려는 바이트 [32757]가 있습니다.

다음과 같은 것 :

Byte byteArray[] = new Byte[32757];
TcpClient sock = new TcpClient();
sock.GetStream().read(byteArray, 0 byteArray.length);

바이트 32757 바이트가없는 경우, 바이트 배열의 크기를 구성하기 위해 충분한 빈 패킷이 전송 될 때 까지이 코드가 대기한다고 가정합니다. 이 올바른지?

Telnet 서버가 원하는 모든 것을 보내는지 확인하는 방법이 있습니까? Telnet 세션의 각 '페이지'에 눈에 띄는 종단 문자열이 없습니다.

이 코드를 수정하는 방법은 한 번에 몇 바이트를 읽고 문자열에 추가하고 문자열에 종료 된 문자 또는 숯 세트를 확인하고 찾은 경우 리턴하는 것입니다. 그렇지 않으면 더 많은 바이트를 읽고 문자열에 추가하고 다시 확인하십시오.

제안?

도움이 되었습니까?

해결책

아니, Stream.Read 일반적으로 모든 것을 읽을 때까지 기다리지 않으며 네트워크 스트림에 대한 가능성이 훨씬 적습니다. 사용 가능한 모든 데이터를 읽거나 약간 사용 가능한 데이터이지만 그게 전부입니다.

서버 "마무리"라는 실제 개념은 없습니다.

  • a) 얼마나 보낼 것인지 미리 알려줍니다.
  • b) 일종의 종료 데이터로 완료된 시점을 나타냅니다.
  • c) 연결을 닫습니다

"읽기 중 하나가 5 초 이상이 걸릴 때까지 계속 읽는다"는 효과를 얻기 위해 일종의 타이머를 사용하고 싶을 수도 있습니다. 그래도 읽기는 여전히 발생하고 있습니다. UI (또는 무엇이든)를 업데이트하기 위해 그 시간을 선택합니다. 그것은 매우 까다로운 주제이며, 당신은 정말로 매우 자신의 마음 (그리고 문서!)에서 당신이하고 싶은 일과 어떤 스레드가 무엇을 처리 할 것인지를 명확하게하십시오.

대안은 TcpClient, 그러나 나는 그것에 대한 경험이 없습니다. 당신은 아마만 사용하면 될 것입니다 TcpClient.ReceiveTimeout 그런 다음 결과를 처리합니다 IOException 적절하게 읽을 때 적절하지만 그에 대한 조언이 없습니다.

다른 팁

Jon Skeets 설명 외에도 작은 팁 :

Telnet은 텍스트 (line) 기반 프로토콜이므로 Byte []에서 읽는 것은 텍스트를 다시 조정해야한다는 것을 의미합니다. 당신은 텍스트 트레이더와 함께 더 나을 것입니다 :

System.IO.TextReader reader = new System.IO.StreamReader(
           sock.GetStream(), Encoding.ASCII);
string line;
while ((line = reader.ReadLine()) != null)  ...;

Telnet이 ASCII를 사용한다고 생각합니다.

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