C#套接字和SslStreams

我很困惑在处理套接字时使用什么是“最好的”。 Socket对象提供发送/接收方法(和异步等效方法),但也允许创建NetworkStream。 我使用Socket.Send获得任何乐趣的唯一方法是将调用包装在一个块中,例如:

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

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

谢谢。

经验法则:

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

在AuthenticateAsClient / Server之后,您的连接将受到SSL保护。 不要再调用Socket或NetworkStream方法:这将破坏SslStream。

(在某些情况下可以忽略这些规则,但是你需要非常小心并准确地知道Socket,NetworkStream和SslStream在底层做什么。如果你总是使用最外层的包装器,那么你就是安全的。)