当前位置: 首页 > 编程语言 > C#

UdpClient-限制缓冲区?分享

时间:2023-04-10 22:21:21 C#

UdpClient-限制缓冲区?我在C#中遇到UdpClient问题。我正在通过互联网在两个客户端之间传输音频。在我的麦克风上,采样率为16khz,我发送带有音频的UDP数据包,每个数据包6400字节。这些永远不会通过,除了最后一个数据包,自从我关闭记录以来,它通常在1200-3400左右。当我将采样率降低到8khz时,我发送了3200字节有效负载的数据包。这些总是有原因的。所以基本上高于3200的任何东西都会被搞砸(没有测试确切的数字,但是......)为什么会这样?我想也许UdpClient内部缓冲区太小或什么的?因为我在流式传输音频数据包,所以经常发送。接收:privatevoidaudioReceive(IAsyncResultasyn){try{byte[]temp=audioSock.EndReceive(asyn,refthis.serverEP);this.waveProvider.AddSamples(temp,0,temp.Length);this.textbox_display.Text=this.textbox_display.Text+"得到的字节数:"+temp.Length;audioSock.BeginReceive(newAsyncCallback(audioReceive),null);}catch(Exceptionez){MessageBox.Show("audioReceive:"+this.textbox_nick.Text+""+ez.ToString());我找不到任何明显错误的地方。(顺便说一句,该函数的异步对象为null,我不需要使用状态对象,但这与此无关)我知道UDP不可靠,但考虑到每个3200大小的数据包都通过,6400大小的数据包有异味对我来说很可疑,尤其是最大尺寸为64kb?有任何想法吗?超过MTU(我认为大约1500字节)的数据包可能会被丢弃。例如,请看这个。听起来你可能会碰到类似的东西。为了使其在不同的环境中更可靠地工作,最好将每个发送的数据包最大化到1472字节(以允许数据包开销),然后在接收端重新组装它们。或者只使用TCP/IP。让一个“简单的”UDP解决方案工作是相当复杂的,即使一些惩罚是可以接受的。我正在开发一种同时支持UDP和TCP/IP通信的产品,并且(有根据的猜测)UDP实现可能涉及10倍的代码并且更复杂。当然,在我们的案例中没有数据丢失是可以接受的,所以改变一些东西。使用IPv4保证576字节(UDP有效负载为548),但对于大多数用户,您应该保持在1472字节(1444UDP)以下。您可以按照此处所述使用ping测试MTU大小的工作方式http://help.expedient.net/broadband/mtu_ping_test.shtmllibjingle使用1280字节的安全默认值(1252UDP/IPv4,1232UDP/IPv6),它匹配IPv6的最低保证,http://code.google.com/p/libjingle/source/browse/branches/nextsnap/talk/session/tunnel/pseudotcpchannel.cc?spec=svn17&r=13从2014年开始这个链接可能是此问题的最佳答案,因为:UdpClient类.NET参考源。以上就是C#学习教程:UdpClient-limitbuffer?如果分享的内容对你有用,需要了解更多C#学习教程,希望大家多多关注——privateconstintMaxUDPSize=0x10000;...privatebyte[]m_Buffer=newbyte[MaxUDPSize];本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: