【问题标题】:c# udp check if message reachedc# udp 检查消息是否到达
【发布时间】:2018-09-03 12:01:58
【问题描述】:

您如何检查消息是否已到达目的地,我想出了一个解决方案,但由于我不是此类主题的专业人士,我想知道其他一些方法。 我的解决方案是(客户端)发送数据包,如果在超时时间内没有收到确认,则再次发送,(服务器端)如果收到的消息是正确的发送确认,如果在另一端没有收到则再次发送. 这是该算法的示意图, Picture。 简而言之,双方发送消息两次。 还有其他想法吗?

【问题讨论】:

  • 为什么不使用自动发送ACK的TCP
  • 基于 TCP 的通信能够发回响应以验证消息已传递。对于你的情况,我会使用 TCP 而不是 UDP
  • 它想制作一个 API 来在不同的项目(例如实时游戏或流媒体)中实现它,而不需要同时使用 TCP 和 UDP,而只是使用诸如 WaitForFeedback 之类的变量来实现如果有时间紧迫的信息,请告知。

标签: c# udp udpclient


【解决方案1】:

这取决于您的应用程序。但是看你附上的图表,你更喜欢 TCP 通信。

但是,如果你真的想使用 UDP 而不是 TCP,你必须放弃 ACK 的东西。

假设您不断将图像流式传输到远程目标。只要流媒体的速度尽可能快,您就不必担心一些帧丢失。您可以使用 UDP。还要考虑传输线(物理层)预测结果的可靠性。

但如果您的应用程序对时间要求不高,但需要尽可能高的可靠性,那么您可以使用 TCP。

更多细节[访问]

下面是与UDP和TCP的一些比较

UDP 协议是一个非常简单的协议,它允许通过 IP 发送数据报。在传输时间关键型数据方面,UDP 比 TCP 更可取,因为 TCP 的许多可靠性特性往往是以更高的延迟和延迟为代价的,这是由于在丢包的情况下无条件重新发送数据而导致的。

与 TCP 不同,TCP 向程序员提供每个连接的对等点一个有序的八位字节流,UDP 提供基于数据包的接口,没有连接对等点的概念。到达的数据报包含一个源地址1,程序员需要手动跟踪概念上的对等“连接”。

TCP 保证 2 给定的八位字节将被传递给连接的对等体,或者连接将被中断并通知程序员。 UDP 不保证任何给定的数据包都会被传递,并且在数据包丢失的情况下不提供通知。

TCP 保证发送的每个八位字节都将按照发送的顺序被接收。 UDP 不保证以任何特定顺序接收传输的数据包,尽管 IP 等底层协议暗示在没有路由和/或硬件错误的情况下,通常会按照传输的顺序接收数据包。

TCP 对传输数据的大小没有限制。 UDP 直接向程序员公开了几个特定于实现的(但也是标准化的)数据包大小限制。创建大小超过这些限制的数据包会增加数据包被碎片化或简单丢弃的机会。分片是不可取的,因为如果数据报的任何单个片段丢失,则整个数据报将自动丢弃。由于各种重叠的标准,为数据报制定一个安全的最大大小并非易事。

【讨论】:

  • 谢谢 Leandro,我想我没有阐明这样做的目的,我过去在许多项目中都使用过 TCP,我确信它工作得很好,但我正在尝试do 是一个用于多个项目的 api,尤其是在线游戏和流媒体应用程序,如图“WaitForFeedback”所示我想要一个变量来从关键信息切换到非关键信息,我正在寻找另一种方式,因为我已经知道将变量设置为 true 将涉及大量内存和线程管理。
  • @CreţuCosmin 好的。因此,在您的情况下,您不想在不重要时不进行校验和。我认为它不会消耗内存,而是消耗 CPU 负载。但是,当您更改为关键时,您启用校验和,这是您想要发回 ACK 并检查是否收到 ACK 的时间?其实应该没问题。您也可以尝试打开两个套接字 - TCP 和 UDP。但这将是困难但具有挑战性的。我知道很多网络游戏已经在使用这个了。
  • 是的,TCP itef 设置起来有点苛刻,而 UDP 不是,也许我会设法完成 API,然后将其公开给所有人,这只是一个问题发送(消息,关键布尔);无论如何,我想没有什么不实现超时,不应该是其他更简单的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多