Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#插座和SSL流_C#_Sockets_Ssl - Fatal编程技术网

C#插座和SSL流

C#插座和SSL流,c#,sockets,ssl,C#,Sockets,Ssl,在处理套接字时,我不清楚什么是“最好”使用的。套接字对象提供发送/接收方法(和异步等效方法),但也允许创建网络流。我使用Socket.Send获得乐趣的唯一方法是将调用包装在一个块中,例如: using (Stream stream = new NetworkStream(socket)) { socket.Send(...); stream.Flush(); } 使用SslStream时,如果您在底层套接字上发送消息,它会通过SSL发送吗?我应该只使用Stream.Write(…)

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


using (Stream stream = new NetworkStream(socket)) {
  socket.Send(...);
  stream.Flush();
}
使用SslStream时,如果您在底层套接字上发送消息,它会通过SSL发送吗?我应该只使用Stream.Write(…)而不是socket方法吗

谢谢。

经验法则:

  • 如果未使用NetworkStream,请使用Socket.Send/Socket.Receive方法
  • 如果您使用的是NetworkStream(正在包装套接字),请使用NetworkStream.Read/Write方法,但不要调用套接字方法
  • 如果要在SslStream中包装NetworkStream,请在调用AuthenticateTasClient/Server之前使用NetworkStream.Read/Write方法,在调用AuthenticateTasClient/Server之后使用SslStream.Read/Write方法
对客户端/服务器进行身份验证后,您的连接将受到SSL保护。然后不要调用Socket或NetworkStream方法:这将破坏SslStream


(在某些情况下,可以忽略这些规则,但是您需要非常小心,准确地知道套接字、NetworkStream和SslStream在引擎盖下做什么。如果您总是使用最外层的包装,您就安全了。)

谢谢。如果我关闭任意一端的SslStream,是否可以在同一个套接字上打开一个新套接字?@QmunkE:据我所知,不可以。创建NetworkStream或SslStream后,您将使用它直到连接关闭。