使用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();
}
進一步調查這裏指出,真正的罪犯:
bytes = sslStream.Read(buffer, 0, buffer.Length);
好像,SslStream.Read()
沒有返回。在調試屏幕中檢查byte[] buffer
可以發現響應已被寫入buffer
,直到crlf
。這個功能已經完成了它的工作,但是它還沒有成功返回?!
這可能是什麼原因?我應該採取哪些措施來忽略這個問題?
此外,對於持懷疑態度的人:我以前openssl
,看看服務器行爲,因爲它應該,什麼都在服務器端的罰款。
注意:我已經知道SslStream.ReadTimeout
屬性。儘管它通過提高exception
來完成這項工作,但對於每種情況都不是正確的答案,特別是當服務器響應大量數據流時,只能使用while循環和緩衝區高效讀取數據。
您是否使用SslSocket.BeginRead/EndRead獲得任何不同的行爲? –
我還沒有試過,等一下,讓我檢查一下。 @PeterRitchie –