请问UDP怎么实现文件可靠传输?

yunzhong8080 2015-09-09 07:53:29
我现在局域网络采用UDP实现文件传输,可测试的传输文件老实丢包错误,打不开,请问怎么实现可靠传输呢,网上看到有个UDT协议的,可以实现,可不知道C#怎么去实现呢?
以前看到局域网的飞鸽传输文件非常快,他是采用的UDP不?
谢谢各位哈!
...全文
1040 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
muzi1314_ 2017-03-24
  • 打赏
  • 举报
回复
用哪个好呀,各位大大。。。
tcmakebest 2015-09-12
  • 打赏
  • 举报
回复
既然都没有说一定要用UDP的原因,又何必问如此奇怪的问题,妥妥的TCP就在那里,楼主是故意无视么
足球中国 2015-09-12
  • 打赏
  • 举报
回复
引用 16 楼 crystal_lz 的回复:
[quote=引用 15 楼 zanfeng 的回复:] 在接受端受到一个包后 回复一个确认包 如果发送端没有受到这个包就重发包 我现在处理的就是这个方式。
那如果回复的确认包丢了呢?。。。那么发送端就会再次发送一个数据包 其实这个操作已经没有必要了 因为 对方这个数据包已经收到了[/quote] 这个看你的处理方式了。这些个处理方式。可以有多种,只要能达到效果就可以了。TCP也会粘包。也会出现网络堵塞,也会出现异外断开等各种原因。
crystal_lz 2015-09-11
  • 打赏
  • 举报
回复
引用 15 楼 zanfeng 的回复:
在接受端受到一个包后 回复一个确认包 如果发送端没有受到这个包就重发包 我现在处理的就是这个方式。
那如果回复的确认包丢了呢?。。。那么发送端就会再次发送一个数据包 其实这个操作已经没有必要了 因为 对方这个数据包已经收到了
足球中国 2015-09-11
  • 打赏
  • 举报
回复
在接受端受到一个包后 回复一个确认包 如果发送端没有受到这个包就重发包 我现在处理的就是这个方式。
crystal_lz 2015-09-11
  • 打赏
  • 举报
回复
引用 13 楼 zanfeng 的回复:
[quote=引用 11 楼 crystal_lz 的回复:] udp本来就是不可靠的 举例来说 tcp就像打电话 在你想说话前 必须先拨通号码 建立好连接才能说话 就是三步握手 tcp可以“保证”你发送的数据肯定可以到达对方而且是顺序到达 udp就像发短信 你编辑类容发送即可 不需要确认对方是否开机 是否是空号等 都能发送成功 但是对方收不收得到 就不确定了 而且不能保证你发送的短信是顺序到达的 如果你非要用udp的话 你可以 在发送文件时候 先对数据包分块 比如512k一个包 然后带上一个包顺序 1 2 3 4 5。。。然后发送的时候 带上这个信息 然后全部发送过去 在接受方 然后对包进行重组 比如 收到一个包 看他是第几个块 比如 先收到2那么 就知道 这个是文件的 第二个 512字节数据 然后接收方在一个时间范围类 确认 是不是收到了 所有的 1 2 3 4 5 如果还有那个包 没有收到 那么就发送一个请求到发送方 比如 第五个包 没有收到 然后发送方 再次发送第五个数据包。。 不过 这样很麻烦的样子 是我自己YY的 参看而已
估计没有人是你这样做的。 UDP与TCP都一样只是一个通信协议。都是发送一些信号过去,只不过TCP为了保证其自身的可靠做了很多的东西。 TCP做的这些东西,你可以自已用UDP自己做。无非加一些校验,加一些失败重发。这些东西说起来复杂,做起并不复杂。 只要一个包 一个包发,问题还是挺简单的。[/quote] 问题是 你得知道 包是否发送成功才能决定 是否重发啊 要么就是 在接受端受到一个包后 回复一个确认包 如果发送端没有受到这个包就重发包 如果这样做的话 又会存在另一个问题 包确实是发送成功了 但是 发送端没有受到确认包(丢了) 就算过程中没有丢包 来回响应的话 数据包也不少了 感觉有点浪费 tcp会在包头有seq来确认包顺序 所以我感觉 还是发送端只管发送 由接受端来判断是否收到响应包 如过在一定时间内没有收到包发送请求重发对应包 不过在这之前得先在双方约定好 有多少包 我不知道你的具体思路是怎样实现的 所以也不知道怎么联想过去。。
足球中国 2015-09-11
  • 打赏
  • 举报
回复
引用 11 楼 crystal_lz 的回复:
udp本来就是不可靠的 举例来说 tcp就像打电话 在你想说话前 必须先拨通号码 建立好连接才能说话 就是三步握手 tcp可以“保证”你发送的数据肯定可以到达对方而且是顺序到达 udp就像发短信 你编辑类容发送即可 不需要确认对方是否开机 是否是空号等 都能发送成功 但是对方收不收得到 就不确定了 而且不能保证你发送的短信是顺序到达的 如果你非要用udp的话 你可以 在发送文件时候 先对数据包分块 比如512k一个包 然后带上一个包顺序 1 2 3 4 5。。。然后发送的时候 带上这个信息 然后全部发送过去 在接受方 然后对包进行重组 比如 收到一个包 看他是第几个块 比如 先收到2那么 就知道 这个是文件的 第二个 512字节数据 然后接收方在一个时间范围类 确认 是不是收到了 所有的 1 2 3 4 5 如果还有那个包 没有收到 那么就发送一个请求到发送方 比如 第五个包 没有收到 然后发送方 再次发送第五个数据包。。 不过 这样很麻烦的样子 是我自己YY的 参看而已
估计没有人是你这样做的。 UDP与TCP都一样只是一个通信协议。都是发送一些信号过去,只不过TCP为了保证其自身的可靠做了很多的东西。 TCP做的这些东西,你可以自已用UDP自己做。无非加一些校验,加一些失败重发。这些东西说起来复杂,做起并不复杂。 只要一个包 一个包发,问题还是挺简单的。
  • 打赏
  • 举报
回复
引用 8 楼 zanfeng 的回复:
udp还是很可靠的。就是自己要做很多东西。在局域网udp的特性体现不出来。但是在广域网内,效果相当突出,决大多数文件传输都是udp的。
什么叫做“自己要做很多东西”,这个不可含糊吧?!
crystal_lz 2015-09-11
  • 打赏
  • 举报
回复
udp本来就是不可靠的 举例来说 tcp就像打电话 在你想说话前 必须先拨通号码 建立好连接才能说话 就是三步握手 tcp可以“保证”你发送的数据肯定可以到达对方而且是顺序到达 udp就像发短信 你编辑类容发送即可 不需要确认对方是否开机 是否是空号等 都能发送成功 但是对方收不收得到 就不确定了 而且不能保证你发送的短信是顺序到达的 如果你非要用udp的话 你可以 在发送文件时候 先对数据包分块 比如512k一个包 然后带上一个包顺序 1 2 3 4 5。。。然后发送的时候 带上这个信息 然后全部发送过去 在接受方 然后对包进行重组 比如 收到一个包 看他是第几个块 比如 先收到2那么 就知道 这个是文件的 第二个 512字节数据 然后接收方在一个时间范围类 确认 是不是收到了 所有的 1 2 3 4 5 如果还有那个包 没有收到 那么就发送一个请求到发送方 比如 第五个包 没有收到 然后发送方 再次发送第五个数据包。。 不过 这样很麻烦的样子 是我自己YY的 参看而已
足球中国 2015-09-11
  • 打赏
  • 举报
回复
demo。。
crystal_lz 2015-09-11
  • 打赏
  • 举报
回复
引用 8 楼 zanfeng 的回复:
udp还是很可靠的。就是自己要做很多东西。在局域网udp的特性体现不出来。但是在广域网内,效果相当突出,决大多数文件传输都是udp的。 这是我们刚给一个客户做的局域网,多文件上传下载,支持断点续传的。 http://download.csdn.net/detail/zanfeng/9099255
蓝色的背景和 黑色的文字 显示效果惨不忍睹 换一下颜色吧。。
足球中国 2015-09-11
  • 打赏
  • 举报
回复
udp还是很可靠的。就是自己要做很多东西。在局域网udp的特性体现不出来。但是在广域网内,效果相当突出,决大多数文件传输都是udp的。


这是我们刚给一个客户做的局域网,多文件上传下载,支持断点续传的。
http://download.csdn.net/detail/zanfeng/9099255

devmiao 2015-09-10
  • 打赏
  • 举报
回复
直接用tcp吧。udp上加上校验之类的东西不是重复造轮子么
於黾 2015-09-10
  • 打赏
  • 举报
回复
飞秋在传输文件的时候应该是用的UDP,所以经常性的接收到文件打不开,显示文件损坏,要重新发送.
  • 打赏
  • 举报
回复
UDP本来就是不可靠的。所谓”可靠传输“很简单,就是自己写不断地确认、重发、确认、重发、确认......的动作。 实际上的这样的所谓”可靠的“UDP,性能已经惨不忍睹了,而且阻塞了网络(而TCP是为了优化网络带宽而设计的君子协定),根本没有必要使用UDP了。因此 UDP 应该用在丢一些消息也无所谓的场合。
yunzhong8080 2015-09-09
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
没记错的话 飞鸽 应该是TCP的吧。包括现在的飞秋也是。 UDP 是不可靠的,容易丢包。原因是 其服务端 只管发送数据,并不会收到客户端的应答。也就是 数据只管 发出去,至于客户端接受没接收到 服务端并不关心。 TCP 比UDP 可靠的多,服务端与客户端一直处于 “发送/响应” 模式,不过这种方法比较耗资源。
谢谢2位大大,我刚才查了飞秋, -[1] 飞秋(FeiQ)是一款局域网内即时通信软件, 基于 TCP/IP(UDP)。
exception92 2015-09-09
  • 打赏
  • 举报
回复
没记错的话 飞鸽 应该是TCP的吧。包括现在的飞秋也是。 UDP 是不可靠的,容易丢包。原因是 其服务端 只管发送数据,并不会收到客户端的应答。也就是 数据只管 发出去,至于客户端接受没接收到 服务端并不关心。 TCP 比UDP 可靠的多,服务端与客户端一直处于 “发送/响应” 模式,不过这种方法比较耗资源。
exception92 2015-09-09
  • 打赏
  • 举报
回复
当然,也可以选择使用WCF。
  • 打赏
  • 举报
回复
UDP怎么可能可靠呢,你要可靠TCP是选择,也许还有其它协议可用,但怎么都不可能是UDP

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧