流关闭时发送的信号

时间:2010-12-20 08:52:18

标签: c# multithreading client-server

我有一个客户端 - 服务器应用程序,我观察到(在本地环境即局域网中)当我关闭一端将客户端连接到服务器的流时,另一端是可观察的(即,如果在我的客户端我关闭连接客户端到服务器的流,在另一端,在服务器上,它是显而易见的,它被报告为围绕我的服务器流代码的try-catch块中的异常)。

怎么可能?客户端/服务器是否在关闭流之前发送流关闭的特定代码?它是否也适用于更广泛的网络(如大型广域网)?

更大的问题是,当我在一端关闭一个流时,我能否依赖于这样一个事实:在另一端它会被注意到并因此关闭该线程而不是无休止地等待接收永远不会来的数据由于该流被关闭的事实?

客户端和服务器之间的最大距离是700公里(我不知道它是否起作用但我提到它以防万一)

谢谢!

1 个答案:

答案 0 :(得分:3)

在TCP中,connection shutdown procedure当然需要向另一方发送额外的数据报,因此每一方都会注意到连接是有序关闭的。

依赖于此有一个主要缺陷:如果无序关闭(例如网络电缆的物理断开),则不会发送通知。 TCP中有一个“keepalive”功能,另一端会定期ping连接是否仍然存在,但由于ping频率非常低(小时数),因此不太实用。如果“大多数”连接看到有序关闭(包括客户端应用程序崩溃,只要系统保持运行),那么依赖关闭通知是合理的。服务器软件通常会在每个连接中设置超时,以确保安全。