Не уверен, что кому-то все равно, потому что это так старо, но мне нужно было сделать это на этой неделе, и я не смог найти в интернете ничего, что отвечало бы моим потребностям. Может быть, есть что-то новое в фреймворке, которое делает это, что я не смог найти ... Несмотря на это, я бы опубликовал исходный код, но так как я написал это для своей компании, и они, как правило, осуждают это, я просто обрисую подход взял:
Поскольку SslStream принимает поток в конструкторе, я реализовал свой собственный подтип Stream с базовым MemoryStream для чтения и другим для записи. Я также передаю TcpClient этому объекту.
Я использовал TcpClient для подтверждения связи по настройке SSL-соединения. После аутентификации сервера или клиента, в зависимости от того, как я его использую, я использую два моих MemoryStream для чтения / записи SslStream.
Итак, для асинхронной записи я сначала записываю свою полезную нагрузку в SslStream, который заполняет мой MemoryStream для записи зашифрованными данными. С зашифрованными данными из MemoryStream я заполняю буфер SocketAsyncEventArgs и вызываю метод TcpClient SendAsync. Для чтения это в значительной степени наоборот.
Не могу сказать, что это особенно волнует меня, когда я перемещаю подобные данные, но если вы не позволяете вашим объектам MemoryBuffer постоянно перераспределяться, это не проблема производительности. По крайней мере, таким образом я могу использовать только фреймворк и свой собственный код, не полагаясь на стороннее программное обеспечение.