C#套接字和SslStreams

Chr*_*per 4 c# sockets ssl

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


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

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

谢谢.

dtb*_*dtb 15

经验法则:

  • 如果您没有使用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在底层做什么.如果你总是使用最外层的包装器,那么你就是安全的.)