c# - UdpClient——缓冲区大小有限?

标签 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());
        }

    }

我找不到任何明显的错误。 (函数的 asyn 对象是 null btw,我不需要使用 stateobject ,但这不应该与此相关)

我知道 UDP 不可靠,但考虑到每一个 3200 大小的数据包都通过并且没有 6400 大小的数据包对我来说有问题,尤其是最大大小是多少,64kb?

有什么想法吗?

最佳答案

超过 MTU(我认为大约 1500 字节)的数据包可能会被丢弃。例如,see this .听起来您可能遇到了某种形式的问题。为了让它在不同的环境中更可靠地工作,最好将每个数据包发送到 1472 字节(以允许数据包开销),然后在接收端重新组装它们。

或者也许只使用 TCP/IP。即使一些损失是可以接受的,但要使“简单”的 UDP 解决方案起作用可能会相当复杂。我开发的产品支持 UDP 和 TCP/IP 通信,并且(有根据的猜测)UDP 实现涉及的代码量可能是原来的 10 倍,而且复杂性要高得多。当然,在我们的情况下,没有数据丢失是可以接受的,所以这改变了一些。

关于c# - UdpClient——缓冲区大小有限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4456243/

相关文章:

C# - 如何确定映射的 EXE 配置文件中是否存在配置节?

networking - 我的网络浏览器如何解析域名?

java - 当我尝试连接 mysql 数据库时,主机名显示不同?

xcode - 我正在使用 Xcode 快速编写一个基本的命令行(UDP)服务器/监听器。 #GCDAsyncUdpSocket 不会调用我的任何代表

c++ - 高效地发送 UDP 数据包流

c# - gStreamer-Sharp - 管道无法链接

c# - MvvmCross Android EditText 绑定(bind)不更新屏幕

c# 如何重构我的线程程序

python - 如何使用networkx生成随机网络但保持原始节点度?

Python dhcp 客户端