Kai*_*aan 5 c# networking udp udpclient
我在C#中遇到了UdpClient问题.我通过互联网在两个客户端之间传输音频.
在我的麦克风上,采样率为16khz,我发送带有音频的UDP数据包,每个数据包6400字节.这些从来没有通过,除了最后的数据包,自从我关闭录音以来通常大约1200-3400的东西.当我将采样率降低到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());
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到任何明显的错误.(该函数的asyn对象是null btw,我不需要使用stateobject,但这不应该与此相关)
我知道UDP不可靠,但考虑到每个3200大小的数据包都通过了,没有6400大小的气味给我带来腥味,特别是最大大小是64kb?
有任何想法吗?
超过 MTU(我认为大约 1500 字节)的数据包可能会被丢弃。例如,请参阅此。听起来您可能遇到了某种形式的这种情况。为了让它在不同的环境中更可靠地工作,最好将每个数据包的发送量最大化到 1472 字节(以允许数据包开销),然后在接收端重新组装它们。
或者也许只使用 TCP/IP。即使某些损失是可以接受的,要使“简单”的 UDP 解决方案发挥作用也可能相当复杂。我正在开发一款支持 UDP 和 TCP/IP 通信的产品,并且(有根据的猜测)UDP 实现涉及的代码量可能是原来的 10 倍,并且复杂性要高得多。当然,在我们的情况下,任何数据丢失都是不可接受的,因此需要对其进行一些更改。
| 归档时间: |
|
| 查看次数: |
6074 次 |
| 最近记录: |