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

Bra*_*rke 3 c# sockets networking tcpclient

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

为了测试它我运行程序过夜,所以我的程序将打开连接,很长一段时间没有写任何东西,所以防火墙或远程服务器将关闭连接.今天早上我看了一下TCPView并验证连接已关闭,然后告诉我的程序写入套接字.

Write没有抛出任何异常.但是,下一个Write确实按预期抛出了此异常:"System.IO.IOException:无法将数据写入传输连接:远程主机强制关闭现有连接"

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

Mic*_*ski 5

这是因为TCP/IP协议的工作方式.当您调用TcpClient.Write时,数据将被发送到服务器,并且该函数返回成功而不等待服务器响应.

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

  • TCP是一种漏洞抽象.TCP无法保证数据的传递.尽管如此,它还是非常努力.TCP无法保证交付的一个明显情况是,如果另一端的PC被破解.虽然有更微妙的情况:-)如果你的主要问题是一个愚蠢的防火墙/超时连接 - 启用TCP Keepalive的低值发送它们(例如每10分钟)可能会解决你的问题.或者让你的应用程序关闭连接,如果你没有发送任何内容,10分钟,当你有更多数据要发送时,再次设置连接. (2认同)