C# 流关闭时发送的信号

C# 流关闭时发送的信号,c#,multithreading,client-server,C#,Multithreading,Client Server,我有一个客户机-服务器应用程序,我观察到(在本地环境中,即LAN)当我关闭一端连接客户机与服务器的流时,在另一端它是可见的(即,如果在我的客户机中,我关闭了将客户机连接到服务器的流,在服务器的另一端,这是明显的,并且在围绕我的服务器流代码的try-catch块中报告为异常) 这是怎么可能的?客户端/服务器是否发送了一个特定的代码,说明在关闭流之前流已关闭?它是否也适用于更广泛的网络(如大型WAN) 更大的问题是,当我在一端关闭一个流时,我是否可以依赖这样一个事实:在另一端,它将被注意到,并因此关

我有一个客户机-服务器应用程序,我观察到(在本地环境中,即LAN)当我关闭一端连接客户机与服务器的流时,在另一端它是可见的(即,如果在我的客户机中,我关闭了将客户机连接到服务器的流,在服务器的另一端,这是明显的,并且在围绕我的服务器流代码的try-catch块中报告为异常)

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

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

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

谢谢!

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

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

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


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

如果我尝试从客户端发送数据,并且连接已关闭,但由于未知因素,我的客户端未收到关断连接的通知,客户端是否会收到错误或者返回消息说发送的数据尚未收到?假设服务器机器已打开,您将获得“连接重置”向已关闭的连接发送数据时出现错误消息。如果主机关闭,您可能会收到ICMP错误消息。如果消息根本未被确认,则本地TCP堆栈将在超时后产生错误。如果我尝试从客户端发送数据,并且连接已关闭,但我的客户端尚未收到有关clo的通知由于未知因素导致连接中断,客户端是否收到错误消息,表明发送的数据尚未收到?假设服务器机器已打开,则会收到“连接重置”向已关闭的连接发送数据时出现错误消息。如果主机关闭,您可能会收到ICMP错误消息。如果消息根本未被确认,则本地TCP堆栈将在超时后产生错误。