C#套接字和Ssl流

5
我对在处理套接字时使用什么“最好”感到困惑。Socket对象提供了Send/Receive方法(和异步等价物),但也允许创建NetworkStream。我唯一使用Socket.Send的方法来获得任何乐趣是通过使用如下代码块:


using (Stream stream = new NetworkStream(socket)) {
  socket.Send(...);
  stream.Flush();
}

在使用SslStream时,如果您在底层套接字上发送消息,那么它会通过SSL发送吗?我应该只使用Stream.Write(...)而不是socket方法吗?

谢谢。

1个回答

17

经验法则:

  • 如果你没有使用 NetworkStream,请使用 Socket.Send/Socket.Receive 方法。
  • 如果你使用了包装 Socket 的 NetworkStream,请使用 NetworkStream.Read/Write 方法,但不要调用 Socket 方法。
  • 如果你在 SslStream 中包装 NetworkStream,请在调用 AuthenticateAsClient/Server 之前使用 NetworkStream.Read/Write 方法,在之后使用 SslStream.Read/Write 方法。

在 AuthenticateAsClient/Server 后,你的连接将被 SSL 加密。此时不要调用 Socket 或 NetworkStream 方法:这会破坏 SslStream。

(在某些情况下可以忽略这些规则,但需要非常小心,并且准确地了解 Socket、NetworkStream 和 SslStream 在幕后执行的操作。如果总是使用最外层的包装器,你就处于安全的一面。)


谢谢您的提问。如果我在任一端关闭了SslStream,是否可能在同一套接字上打开一个新的SslStream? - Chris Cooper
据我所知,不行。一旦您创建了NetworkStream或SslStream,您将使用它直到连接关闭。 - dtb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接