我对C#很陌生,所以请耐心等待。我在C#.NET 4.0中编写了一个相对简单的客户端服务器应用程序。我使用TCP协议,TCPListener和TCPClient更具体。我知道TCP协议在理论上是如何工作的。但我必须100%确定在数据传输过程中不会出现(未处理的)错误。
发送数据后如何知道数据是否已成功接收。我可以完全依赖TCP协议的底层实现吗?所以我没有必要从另一方确认收到了数据吗?
至关重要的是,我确实知道哪些数据已发送并已成功接收。 我知道这是一个愚蠢的问题,但我真的很想确定。感谢您的时间和答案。
答案 0 :(得分:21)
TCP保证:
它并不能保证啮齿动物不会吃掉你的电缆,建筑物的电源会继续存在,甚至当你操作系统告诉它一些数据时,你正在谈论的另一台机器上的过程也会费心去做因为它已经到了。
如果您需要确认收到数据并采取相应措施,则需要手动发送确认(因为TCP连接是双工的,您已经有了通道来执行此操作)。
当然,所有这些都不是特定于.NET,Windows或任何其他网络堆栈实现的。
更新:我想特别指出,在OS网络堆栈接受数据传输后,您无法知道进程在另一端收到了这些数据。在大多数情况下,网络堆栈知道数据已经到达目标(通过TCP ACK消息),但它不知道目标上的操作系统是否已将它们馈送到它们发往的进程。因此,回送您自己的“收到的数据并采取行动”消息是唯一的选择。
答案 1 :(得分:4)
单独使用TCP / IP,您无法确定是否收到任何数据 - 您必须将最新的协议分层。
如果您可以查明是否收到了某些特定数据,那么TCP / IP会在收到之前保证所有数据。
答案 2 :(得分:1)
没有'.NET TCP协议'这样的东西。只有TCP协议,已经在互联网上运行了大约30年。这很可靠。这是一个设计目标。
答案 3 :(得分:0)
一个选项是通过TCP使用WCF Reliable Sessions。 WCF可靠会话将掩盖传输失败。
答案 4 :(得分:0)
如果您确实需要可靠性 AND 网络传输,为什么不使用消息队列?他们有交易保证(与使用它的开发人员的纪律一样强,但不强于此!)
这就像你的所有流量都具有数据库服务器类型的安全性(和同上性能)。我认为您可以轻松配置.NET Remoting to use an MSMQ channel。
我个人从未做过那个,但我一般都使用过消息排队。