SslStream을 사용하여 일부 소켓 레이어에서 작업. referenceSslStream.Read()의 이상한 동작
나는 간단한 클라이언트를 구현했다. 어색한 부분은 응용 프로그램을 실행할 때 서버가 클라이언트에 응답하지 않는 것입니다.
디버그 화면으로 이동하여 일부 중단 점을 설정하면 끝이없는 루프에있는 것이이 기능임을 깨달았습니다.
static string ReadMessage(SslStream sslStream)
{
// Read the message sent by the server.
// The end of the message is signaled using the
// "<EOF>" marker.
byte [] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
do
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer,0,bytes)];
decoder.GetChars(buffer, 0, bytes, chars,0);
messageData.Append (chars);
// Check for EOF.
if (messageData.ToString().IndexOf("<EOF>") != -1)
{
break;
}
} while (bytes != 0);
return messageData.ToString();
}
추가 조사는 여기에 실제 범죄를 지적 : SslStream.Read()
는 반환하지 않습니다, 같은
bytes = sslStream.Read(buffer, 0, buffer.Length);
보인다. 디버그 화면에서
byte[] buffer
을 확인하면 응답이
crlf
까지
buffer
에 기록되었음을 알 수 있습니다. 이 기능은 작업을 완료했지만 여전히 성공으로 돌아 가지 않습니다!
왜 이런 이유가있을 수 있습니까? 이 문제를 해결하기 위해 어떤 단계를 밟아야합니까?
또한 회의의 경우 : 서버가 정상적으로 작동하는지 확인하기 위해 openssl
을 사용했으며 모든 것이 서버 측에서 문제가되지 않습니다.
참고 : 나는 이미 SslStream.ReadTimeout
속성에 대해 알고 있습니다. exception
을 제기하여 작업을 수행하지만 모든 시나리오에서 올바른 대답은 아닙니다. 특히 서버가 while 루프와 버퍼를 사용하여 효율적으로 읽을 수있는 대량의 데이터 스트림으로 응답하는 경우에 적합합니다.
SslSocket.BeginRead/EndRead를 사용하여 다른 동작이 발생합니까? –
나는 그것을 아직 시험하지 않았다, 내가 그것을 조사하게 해주세요. @PeterRitchie –