C# 套接字和 SslStreams

标签 c# sockets ssl

我对处理套接字时“最好”使用什么感到困惑。 Socket 对象提供 Send/Receive 方法(和异步等效方法),但也允许创建 NetworkStream。我对使用 Socket.Send 感到高兴的唯一方法是将调用包装在一个 block 中,例如:


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

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

谢谢。

最佳答案

经验法则:

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

关于C# 套接字和 SslStreams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725531/

相关文章:

c# - 将泛型限制为可空类型

c# - 自定义编译器警告

c++ - 如何将字节数据从套接字写入 C 中的无符号字符 vector ?

linux - 我们可以计算 Linux 上一整天(比如第一天)建立的 TCP 连接的数量吗

java - HtmlUnit 2.15 可以使用 TLS 而不是 SSL 进行连接吗?

SSL:中间证书遭到破坏——他们可以取消吊销证书吗?

c# - 在 Mono 中触发垃圾回收

c# - 缓冲流 - ASP.NET Core 3.0 中不允许同步操作

python - Python Django-如何同时支持Socket和API

ios - APNS生产证书发行