【问题标题】:How can I achieve a reliable UDP protocol?如何实现可靠的 UDP 协议?
【发布时间】:2016-05-26 01:29:55
【问题描述】:

我知道如何发送和接收 UDP 和 TCP 数据包,我怎样才能实现发送可靠 UDP 数据包的某种方式? 我只是要求一个逻辑,因为我不知道这是如何工作的。 提前致谢。

【问题讨论】:

  • 没有 100% 可靠的方法来确保您的 UDP 消息被发送和接收,但是您可以在您的应用程序中使用确认消息来查看您是否确实收到了发送和接收消息。您最可靠的方法总是通过 TCPIP 发送数据包,但这并不总是 100%。您有任何代码可以与我们分享吗?
  • 为什么在需要可靠性的同时使用 UDP?
  • 如果您想通过网络可靠地发送数据包,请使用 TCP。
  • 在尝试编写网络库之前,您确实需要研究协议。您的代码(刚刚检查过 github)有多个设计问题。
  • 查看现有协议,例如 Google 的 QUIC 或 AFS 的 Rx。他们定义了类似于 TCP 的 UDP 重试机制,以便可以可靠地传递数据。但可能他们没有 .NET 实现,您需要开发它。

标签: c# networking udp


【解决方案1】:

这是我以前公司使用的一些旧代码

这背后还有很多其他的方法,太多了,无法在这里真正分享,但您希望使用 Acknowldgemet 和 Not Acknowledged 消息来显示通信已发送和接收。

public void InitialiseVenemaComms()
{
    string initMessage = null;
    DebugInfo(1, "*** InitialiseVenemaComms");
    initMessage = "002" + StationPrms.StationId + "ACK";

try
{
    System.Net.Sockets.UdpClient udpClient = new System.Net.Sockets.UdpClient(Convert.ToInt32(StationPrms.Venema.LocalPort));
    byte[] messageBytes = System.Text.Encoding.ASCII.GetBytes(initMessage);
    udpClient.Connect(StationPrms.Venema.DNS, Convert.ToInt32(StationPrms.Venema.RemotePort));
    DebugInfo(1, string.Format("*** Sending init message '{0}' from port '{1}' to ip '{2}' on port '{3}'", initMessage, StationPrms.Venema.LocalPort, StationPrms.Venema.DNS, StationPrms.Venema.RemotePort));

    udpClient.Send(messageBytes, messageBytes.Length);
    udpClient.Close();
    DebugInfo(1, "*** Init Message Sent");
}
catch (Exception ex)
{
    DebugInfo(2, "Error: " + ex.Message);
    CssError("Error initalising Venema comms: " + ex.Message);
}

}

但你最好按照我的 cmets 通过 TCPIP 发送。

【讨论】:

  • 你确定你拥有情报财产吗?通常,公司在您受雇时拥有您的工作。
  • 我真的不知道你想在代码中做什么,我在询问逻辑,甚至是某种方式来了解是否使用“System.Net.Sockets. Socket.Send()" 尽可能不回复就到了另一边
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多