0

我正在研究通过 SSL 处理传入数据的异步 TCP 服务器。

我见过很多递归调用的例子SslStream.BeginReadMSDN 例子)。在这种情况下,堆栈会增长,如果传输的数据足够大并以小块的形式发送,这将StackOverflowException在某个时候抛出。

在这个线程中:SslStream BeginReader throw StackOverFlowException有一个建议使用IAsyncResult.CompletedSynchronously,但我不确定如何正确使用它。

使用 处理任何大小的数据传输的正确/可靠方法是什么SslStream

似乎 usingBeginRead不是一种选择,最好在 a or中使用Read/ 。ReadAsyncTaskThread

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
    }
}
4

0 回答 0