SslStream を使用していくつかのソケット レイヤーに取り組んでいます。参照
リファレンスを使用して、単純なクライアントを実装しました。厄介な部分は、アプリケーションを実行するときに、サーバーがクライアントに応答していないように見えることです。
デバッグ画面に入っていくつかのブレークポイントを設定すると、この関数が無限ループしていることに気付きました。
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();
}
さらなる調査により、ここで本当の犯罪者が指摘されました。
bytes = sslStream.Read(buffer, 0, buffer.Length);
どうやら、SslStream.Read()
戻っていないようです。デバッグ画面で確認すると、応答がtilbyte[] buffer
に書き込まれていることがわかります。関数はその仕事を終えましたが、まだ成功していませんか?!buffer
crlf
この理由は何でしょうか?この問題を無視するには、どのような手順を踏む必要がありますか?
また、懐疑的な人のために:openssl
サーバーが正常に動作しているかどうかを確認していましたが、サーバー側ではすべて問題ありません。
注:私はすでにSslStream.ReadTimeout
プロパティを認識しています。を発生させることでジョブをexception
実行しますが、すべてのシナリオで正しい答えとは限りません。特に、while ループとバッファーを使用してのみ効率的に読み取ることができる大量のデータ ストリームでサーバーが応答している場合はそうです。