2010-09-16 35 views
4

我对处理套接字时使用什么“最佳”感到困惑。 Socket对象提供发送/接收方法(和异步等效),但也允许创建NetworkStream。我已经使用Socket.Send任何喜悦的唯一方法是通过在包装块调用,如:C#套接字和SslStreams

 

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

当使用SslStream,如果基础套接字上发送消息,将它送过来SSL?我应该只使用Stream.Write(...)而不是套接字方法吗?

谢谢。

回答

15

规则拇指:

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

AuthenticateAsClient/Server之后,您的连接将被SSL保护。那么不要调用Socket或NetworkStream方法:这将打破SslStream。 (在这种情况下可以忽略这些规则,但是你需要非常小心,并且正确地知道Socket,NetworkStream和SslStream在底层做了什么,如果你总是使用最外层的包装,那么你在安全的一面)。

+0

谢谢你。如果我随后关闭SslStream,是否可以在同一个套接字上打开一个新的? – 2010-09-16 13:17:29

+0

@QmunkE:据我所知,没有。一旦创建了NetworkStream或SslStream,就可以使用它,直到连接关闭。 – dtb 2010-09-16 13:37:34