我有一个简单的程序,它使用TcpClient和SslStream将数据写入套接字。
为了测试它,我运行程序过夜,所以我的程序会打开连接,很长时间没有写任何东西,所以防火墙或远程服务器会关闭连接。今天早上我看了一下TCPView并验证连接已关闭,然后告诉我的程序写入套接字。
写入没有异常。但是,下一个Write确实按预期抛出了这个异常:“System.IO.IOException:无法将数据写入传输连接:远程主机强行关闭现有连接”
我可以看到为什么TcpClient.Connected可以返回True,即使它确实没有连接,但为什么Write不会在实际关闭的连接上抛出异常(在TCPView中验证)?
答案 0 :(得分:5)
这是因为TCP / IP协议的工作方式。 当您调用TcpClient.Write时,数据将被发送到服务器,并且该函数返回成功而不等待服务器响应。
同时服务器返回错误。 您身边的Tcp / IP堆栈会注意到,下次尝试编写它时会抛出异常