我在C#遇到了UdpClient的麻烦。我正在通过互联网在两个客户端之间传输音频。
在我的麦克风上,以16 per的采样率,我发送了带有音频的UDP数据包,每个数据包有6400字节。这些从来没有通过,除了最后一个包,它通常是大约1200-3400左右,因为我关闭了记录。当我将采样率降低到8 8khz时,我发送带有3200字节有效载荷的数据包。这些总是会因为某些原因而被打通。
所以基本上,超过3200的任何东西都会搞砸(还没有测试确切的数字,但是...)这到底是为什么呢?我在想,也许是UdpClient内部缓冲区太小了,还是什么的?因为我流式传输音频数据包被频繁地发送。
接收:
private void audioReceive(IAsyncResult asyn)
{
try
{
byte[] temp = audioSock.EndReceive(asyn, ref this.serverEP);
this.waveProvider.AddSamples(temp, 0, temp.Length);
this.textbox_display.Text = this.textbox_display.Text + " got bytes: " + temp.Length;
audioSock.BeginReceive(new AsyncCallback(audioReceive), null);
}
catch (Exception ez)
{
MessageBox.Show("audioReceive: " + this.textbox_nick.Text + " " +ez.ToString());
}
}我找不到任何明显的缺点。(函数的asyn对象为null,顺便说一下,我不需要使用stateobject,但这与此无关)
我知道UDP不可靠,但考虑到每个3200大小的数据包都通过了,没有6400大小的包对我来说很可疑,特别是最大大小是多少,64kb?
有什么想法吗?
发布于 2010-12-16 08:13:33
超过MTU (我认为大约1500字节)的数据包可能会被丢弃。例如,see this。听起来你可能会遇到这样的情况。为了使其在不同的环境中更可靠地工作,最好是最大限度地发送到每个数据包1472字节(以考虑数据包开销),然后在接收端对其进行重组。
或者仅仅使用TCP/IP。即使有一些损失是可以接受的,让一个“简单的”UDP解决方案工作起来也是相当复杂的。我从事一个支持UDP和TCP/IP通信的产品,UDP实现涉及的代码量可能是UDP的10倍,并且具有更大的复杂性。当然,在我们的情况下,没有数据丢失是可以接受的,所以这会有所改变。
发布于 2010-12-16 11:50:33
使用IPv4可以保证576字节( UDP有效负载为548字节),但至少对于大多数用户来说,您应该将其控制在1472字节(1444UDP)以下。
您可以使用ping测试MTU大小,如下所述:
http://help.expedient.net/broadband/mtu_ping_test.shtml
libjingle使用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
发布于 2015-03-29 15:57:47
自2014年以来,这个链接可能是这个问题的最佳答案:
UdpClient class .NET Reference source。
private const int MaxUDPSize = 0x10000;
...
private byte[] m_Buffer = new byte[MaxUDPSize];https://stackoverflow.com/questions/4456243
复制相似问题