我正在研究通过 SSL 处理传入数据的异步 TCP 服务器。
我见过很多递归调用的例子SslStream.BeginRead
(MSDN 例子)。在这种情况下,堆栈会增长,如果传输的数据足够大并以小块的形式发送,这将StackOverflowException
在某个时候抛出。
在这个线程中:SslStream BeginReader throw StackOverFlowException有一个建议使用IAsyncResult.CompletedSynchronously
,但我不确定如何正确使用它。
使用 处理任何大小的数据传输的正确/可靠方法是什么SslStream
?
似乎 usingBeginRead
不是一种选择,最好在 a or中使用Read
/ 。ReadAsync
Task
Thread
StackOverflowException
如果我以小块传输 1GB 数据,这将抛出。
static void ReadCallback(IAsyncResult ar)
{
SslStream stream = (SslStream)ar.AsyncState;
byteCount = stream.EndRead(ar);
string data = Encoding.UTF8.GetString(buffer, 0, byteCount);
// ... some methods to process data, stack grows
if (byteCount > 0) // 2KB chunk
{
// Keep reading, this will invoke again ReadCallback()
stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReadCallback), stream);
}
else
{
// Connection closed
}
}