Networking c语言中的可靠udp协议#

Networking c语言中的可靠udp协议#,networking,udp,file-transfer,reliability,Networking,Udp,File Transfer,Reliability,互联网上有几篇关于如何使udp可靠的文章。我在c#上找不到。也许我可以实现我的算法 通过对互联网的研究,我认为udp存在两个问题: 它不能确保所有数据都到达目的地 数据可能以不同的顺序到达目的地 也许还有第三个问题,为了使它可靠,我遗漏了 如果您有兴趣了解我为什么希望使udp可靠,以及为什么不使用tcp,请查看。相信我,我一直在尝试做tcp打孔这么长时间 无论如何,也许已经有一个库可以与c一起使用,这将使我能够做到这一点。因为我已经能够找到一个库,所以我一直在考虑以下算法: “假设有计算机

互联网上有几篇关于如何使udp可靠的文章。我在c#上找不到。也许我可以实现我的算法

通过对互联网的研究,我认为udp存在两个问题:


  • 它不能确保所有数据都到达目的地
  • 数据可能以不同的顺序到达目的地
  • 也许还有第三个问题,为了使它可靠,我遗漏了

  • 如果您有兴趣了解我为什么希望使udp可靠,以及为什么不使用tcp,请查看。相信我,我一直在尝试做tcp打孔这么长时间

    无论如何,也许已经有一个库可以与c一起使用,这将使我能够做到这一点。因为我已经能够找到一个库,所以我一直在考虑以下算法:


    “假设有计算机A和计算机B,计算机A是将文件发送到计算机B的计算机”

    以下是我一直在思考的步骤:


    1) 计算机A打开文件进行读取,假设它是5000字节。这意味着计算机A必须向计算机B发送5000字节,确保没有丢失字节,并且顺序正确


    2) 计算机A获取文件的前500个字节,它获取这些字节的散列。所以现在计算机A有两个东西,那500字节的散列,还有字节。(散列将是一种有效的算法,如md5,以确保以正确的顺序接收数据。即md5(1,2,3)!=md5(2,1,3))


    3) 将前500个字节的散列映射为kj82lkdi930fi1


    4) 计算机B应该正在侦听哈希和字节


    5) 计算机A将散列发送到计算机B,它也发送500字节。一旦它发送,它就会开始等待回复


    6) 计算机B现在应该接收哈希和字节。计算机b对接收到的字节执行相同的算法md5。如果该结果等于收到的哈希值,则它用{1,1,1,1,1}回复A,否则它用{2,2,2,2,2,2}回复


    6.5)让我们假设计算机B以正确的顺序获得数据,因此它回复{1,1,1,1,}它还将哈希代码保存在内存或数组中


    7) 计算机A应等待响应以发送下一个500字节。假设它接收{1,1,1}。因为它收到了一个1,它知道它可以继续发送下一个500字节,并使用这500字节的新哈希代码


    8) 计算机A发送下一个500字节及其哈希代码


    9) 让我们假设计算机B没有收到数据,因此它不会回复A。计算机B仍将等待字节和哈希


    8) 由于计算机A在一段合理的时间内没有收到1,1,1,1或2,2,2,2,因此A将再次发送相同的字节和散列


    9) 让我们假设计算机B接收哈希和字节,但字节的接收顺序不同。当计算机B计算这些字节的哈希值时,该哈希值将与接收到的哈希值不匹配。因此,它将以{2,2,2,2,2,2}回复


    10) 如果计算机A收到2,2,2,2,2,2,那么它将发送相同的字节和散列。如果由于某种原因它没有收到2,2,2,2,那么它将在一段时间后发送相同的字节和散列。让我们假设计算机A接收2,2,2,2,2


    11) 计算机A第三次发送相同的字节和散列


    12) 计算机B按正确的顺序接收哈希和字节。结果,它回复1,1,1,1,1,1,并将之前的散列保存到内存中。(回顾步骤6.5)


    13) 让我们假设计算机A没有收到来自B的1,1,1,1响应。然后它将第四次发送相同的字节


    14) 计算机B检查哈希值,如果它等于最后一个被接受的哈希值,则它再次回复1,1,1,而不将这些字节写入文件


    15) 该算法一直如此,直到文件被传输


    我的意思是,很明显,我还需要在这个算法中添加一些其他的东西,比如让计算机B知道传输何时完成。也许会检查更多的错误。如果计算机长时间断开连接会发生什么情况。但主要协议将与我描述的协议类似


    那么你认为我应该开始实现这个算法吗?我是否应该每次增加并发送更多字节。我是说寄1000而不是500?互联网上有很多文章告诉你几种技术,但很少有文章能给出你想要的语言的工作示例。在这种情况下,我需要这个c

    第三个问题是,当您收到数据时,数据可能会损坏

    您可以从阅读开始,了解TCP如何使通信可靠。 有了这些知识,您可以使用UDP作为传输来实现它的一些技术


    还可以看看这个UDP网络库

    ,因为很难进行tcp穿孔!相信我,如果我能用tcp协议连接不同nat上的两个对等点,那么我就不会浪费时间问这个问题了。看看这个问题:。我在互联网上找不到创建tcp穿孔的示例。我发现有几篇文章解释了这是如何工作的,但当我将这些文章翻译成c#时,由于某种原因,它们不起作用。