c# - 为什么 TcpClient.Write 在写入关闭的连接(第一次)时不会抛出异常?

标签 c# networking sockets tcpclient

我有一个简单的程序,它使用 TcpClient 和 SslStream 将数据写入套接字。

为了测试它,我将程序运行了一整夜,这样我的程序就会打开连接,长时间不写入任何内容,这样防火墙或远程服务器就会关闭连接。今天早上我查看了 TCPView 并确认连接已关闭,然后告诉我的程序写入套接字。

Write 没有抛出异常。然而,下一个 Write 确实按预期抛出了这个异常:“System.IO.IOException:无法将数据写入传输连接:现有连接被远程主机强行关闭”

我明白为什么 TcpClient.Connected 可以返回 True,即使它真的没有连接,但是为什么 Write 不会在实际关闭的连接上抛出异常(如 TCPView 中所验证的那样)?

最佳答案

这是因为 TCP/IP 协议(protocol)的工作方式。 当您调用 TcpClient.Write 时,数据正在发送到服务器,该函数无需等待服务器响应即可返回成功。

与此同时,服务器返回一个错误。 您这边的 Tcp/IP 堆栈注意到,下次您尝试编写它时将抛出异常

关于c# - 为什么 TcpClient.Write 在写入关闭的连接(第一次)时不会抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1300963/

相关文章:

C# GDI - 如何检查像素是否不透明?

c# - 列出项目到数据库

multithreading - 消息传递任意对象图?

c# - 套接字断开通知方法

Qt 通过 TCP 套接字实时流式传输音频

javascript - ViewData编译错误: BC30203: Identifier expected

c# - BufferedWaveProvider 在 Unity 中不起作用

c++ - poll() 是边缘触发函数吗?

c - sysfs、ifreq、IOCTL 或 ???以编程方式监控网络状态

Java Socket仅适用于 "localhost",但不适用于专用网络