当前位置:  开发笔记 > 编程语言 > 正文

无法在大于10K的UDP上发送图像

如何解决《无法在大于10K的UDP上发送图像》经验,为你挑选了1个好方法。

我正在尝试开发客户端/服务器应用程序,其中客户端将图像发送到服务器.

情况1:

服务器在路由器后面的一台计算机上运行,​​客户端在另一台不同路由器后面的计算机上运行.由于此通信将在WAN(公共IP)上进行,因此端口将在服务器端路由器上转发,以便服务器可以轻松地在该端口上接收传入的UDP数据报.

UDP的最大传输单元(MTU)大小为64KB.这意味着UDP套接字应该能够传输任何大小小于或等于65,536字节的东西.在我正在开发的应用程序的情况下,客户端只能发送10-13k的图像(UDP数据报).如果我尝试传输大小超过10Kb的图像,服务器将无法接收它,服务器端UDP套接字将始终处于(接收)阻止模式.

案例2:

服务器在路由器后面的计算机上运行,​​客户端在同一路由器后面的计算机上运行.这意味着客户端和服务器位于同一局域网中.甚至客户端和服务器共享相同的局域网客户端正在服务器的公共IP上发送图像(UDP数据报).在这种情况下,服务器能够接收任何大小的UDP数据报,最高可达64K,这正是我期望从我的应用程序.

我试图在不同的远程PC上运行我的客户端,但结果是一样的.服务器无法接收大于10-13Kb的UDP数据报.如果有人能帮助我处理这种情况,他将不胜感激.

链接到代码:http: //pastebin.com/f644fee71

谢谢你,祝你好运.问候,

与Atif



1> orj..:

虽然IP层可能允许最大64k的UDP数据包,但我认为您会发现最大的"野外"UDP数据包大小将限制在源和目标之间的设备的最小MTU.

标准以太网MTU约为1500字节.一些设备支持高达~10千字节的"巨型"帧以提高性能.但是这种事情通常不会通过公共互联网支持,只能在局域网上支持.

IP层可以对UDP分组进行分段(除非在分组中设置无分段比特).但是,如果按顺序接收每个片段(或在特定时间限制内无序),则接收者将仅接收和整理分组.否则它将丢弃该数据包.

也可能是源和目标之间的所有设备都不支持发送设备的帧大小.我遇到过需要将路由器上的MTU降低到~1450字节的情况,因为中间路由器在1500处丢弃数据包.这是由于MTU发现无法可靠地工作.即,发送设备无法确定其到达目的地的路径上的MTU是什么.在该路径中的某个位置,设备将丢弃它认为太大的数据包.

对于你正在做的事情,UDP是一个非常糟糕的主意.你最好使用TCP.

如果您担心TCP连接设置/拆卸的性能,请尽可能长时间保持连接.

当你不太关心目标是否收到数据包时,UDP只是一个很好的协议来传递数据.交货不保证.在所有其他情况下使用TCP.

如果您决定使用UDP,则必须在协议中实现路径MTU发现,并捕获路由器/防火墙不会阻止"需要分片"的ICMP数据包.否则他们不应该使用TCP也不行.但就像我说的那样,我曾经看过过去需要碎片的ICMP数据包被阻止或丢弃的情况,我不得不手动调整自己的MTU.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有