C# 是否可以断开tcp连接而不接收通知/异常

C# 是否可以断开tcp连接而不接收通知/异常,c#,networking,C#,Networking,我目前的工作假设是,当使用System.Net.Sockets.Socket.Send发送TCP数据时,如果连接断开,我保证会收到异常。是否可以在操作系统层断开连接,而不在顶部的C#应用程序中接收通知/异常 我不认为在.net中会有这样的情况,但我该如何向持怀疑态度的人证明这一点。事实上,就我所知这是可能的。想象一下,你创建了一个数据包,发送它时,它被丢弃了。当ttl超时时,操作系统应自动重新传输。它将在放弃之前重试几次。我记得,更高级的防火墙有一个小的选择。不管有没有通知,都要放弃。第二个看起

我目前的工作假设是,当使用System.Net.Sockets.Socket.Send发送TCP数据时,如果连接断开,我保证会收到异常。是否可以在操作系统层断开连接,而不在顶部的C#应用程序中接收通知/异常


我不认为在.net中会有这样的情况,但我该如何向持怀疑态度的人证明这一点。

事实上,就我所知这是可能的。想象一下,你创建了一个数据包,发送它时,它被丢弃了。当ttl超时时,操作系统应自动重新传输。它将在放弃之前重试几次。我记得,更高级的防火墙有一个小的选择。不管有没有通知,都要放弃。第二个看起来像是包在去目的地的路上“丢失了”。他们实际上收到它,但让我们说-发送他们到null没有任何答案。
我不知道socket.send是如何工作的,但从网络的角度来看,可能无法确认丢失/丢弃的每个数据包

事实上,据我所知这是可能的。想象一下,你创建了一个数据包,发送它时,它被丢弃了。当ttl超时时,操作系统应自动重新传输。它将在放弃之前重试几次。我记得,更高级的防火墙有一个小的选择。不管有没有通知,都要放弃。第二个看起来像是包在去目的地的路上“丢失了”。他们实际上收到它,但让我们说-发送他们到null没有任何答案。
我不知道socket.send是如何工作的,但从网络的角度来看,可能无法确认丢失/丢弃的每个数据包

使用TCP,没有“数据包”这样的东西。TCP是一种面向流的协议,这意味着数据只是一个大的字节流。如果在流结束之前接收数据(接收操作以0字节完成),则可以100%肯定发送给您的所有数据实际上都已接收。当然,如果您强制终止连接,或者如果您保持连接打开,并且想知道您是否已收到迄今为止发送的所有信息,则无法确定您是否收到了。如果您是发送方,则确定远程端点是否已收到您的数据的唯一方法是询问它。当然,实现这一点的一种方法是应用程序级协议要求远程端点保持其连接打开,直到它接收到您发送的所有数据。在这种情况下,从远程端点接收流的结尾会通知发送方他们已经接收了所有内容。但很明显,这适用于向一个方向移动的数据;如果没有额外的协商,两个端点都不可能知道每个端点都收到了对方的数据。当我说“数据包”时,我指的是包含TCP段的IP数据报。“我指的是包含TCP段的IP数据报”--我不知道怎么做。套接字本身并不发送这些数据,当然底层网络层会将客户端传输转换成这些数据。但是,不管怎样。那些东西总是掉下来。TCP的要点是,客户机代码从未看到这一点。该协议确保客户端以正确的顺序重新发送和接收丢弃的IP数据报。“如果.net无法从操作系统层拾取丢弃的连接会怎么样?”——这将是一个错误,而且不太可能。不要介意有太多基于
Socket
的程序(我猜有上万个“严重”程序,可能至少有上万个),而且
Socket本身是Winsock上的一个非常薄的层,Winsock本身已经使用了二十多年。你真正需要担心的是你自己的代码。与
Socket
类相比,它包含bug的可能性可能要高出一百万倍。使用TCP,没有“数据包”这样的东西。TCP是一种面向流的协议,这意味着数据只是一个大的字节流。如果在流结束之前接收数据(接收操作以0字节完成),则可以100%肯定发送给您的所有数据实际上都已接收。当然,如果您强制终止连接,或者如果您保持连接打开,并且想知道您是否已收到迄今为止发送的所有信息,则无法确定您是否收到了。如果您是发送方,则确定远程端点是否已收到您的数据的唯一方法是询问它。当然,实现这一点的一种方法是应用程序级协议要求远程端点保持其连接打开,直到它接收到您发送的所有数据。在这种情况下,从远程端点接收流的结尾会通知发送方他们已经接收了所有内容。但很明显,这适用于向一个方向移动的数据;如果没有额外的协商,两个端点都不可能知道每个端点都收到了对方的数据。当我说“数据包”时,我指的是包含TCP段的IP数据报。“我指的是包含TCP段的IP数据报”--我不知道怎么做。套接字本身并不发送这些数据,当然底层网络层会将客户端传输转换成这些数据。但是,不管怎样。那些东西总是掉下来。TCP的要点是,客户机代码从未看到这一点。该协议确保客户端以正确的顺序重新发送和接收丢弃的IP数据报。“如果.net无法从操作系统层拾取丢弃的连接会怎么样?”——这将是一个错误,而且不太可能。不要介意有太多基于
Socket
的程序(我猜有上万个“严重”程序,可能至少有上万个),而且
Socket本身是Winsock上的一个非常薄的层,Winsock本身已经使用了二十多年。你真正需要做的是