5

C#のUdpClientで問題が発生しています。2つのクライアント間でインターネット経由でオーディオをストリーミングしています。

私のマイクでは、16kHzのサンプルレートで、パケットあたり6400バイトの音声付きのUDPパケットを送信します。録音を閉じてから通常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ですが、stateobjectを使用する必要はありませんが、これに関連する必要はありません)

UDPは信頼できないことは知っていますが、3200サイズのパケットがすべて通過し、6400サイズが私には不快な臭いがしないことを考えると、特に最大サイズは64kbですか?

何か案は?

4

3 に答える 3

2

MTU(約1500バイトだと思います)を超えるパケットは破棄される可能性があります。たとえば、これを参照してください。あなたはこれの何らかの形に遭遇しているかもしれないように聞こえます。さまざまな環境でより確実に機能できるようにするには、送信をパケットあたり1472バイトに最大化して(パケットのオーバーヘッドを考慮に入れるため)、受信側でそれらを再アセンブルする方がよい場合があります。

または、TCP/IPを使用することもできます。ある程度の損失が許容できる場合でも、「単純な」UDPソリューションを機能させるのはかなり複雑になる可能性があります。私はUDPおよびTCP/IPを介した通信をサポートする製品に取り組んでおり、(知識に基づいた推測で)UDPの実装にはおそらく10倍のコードが含まれ、はるかに複雑です。もちろん、私たちの状況では、データの損失は許容できないので、それはそれをいくらか変えます。

于 2010-12-16T00:13:32.940 に答える
0

IPv4では576バイト(UDPペイロードの場合は548)が保証されていますが、少なくともほとんどのユーザーについては、1472バイト(1444 UDP)未満に保つように注意する必要があります。

ここで説明するように、pingを使用してどのMTUサイズが機能するかをテストできます。

http://help.expedient.net/broadband/mtu_ping_test.shtml

libjingle安全なデフォルトの1280バイト(1252 UDP / IPv4、1232 UDP / IPv6)を使用します。これは、IPv6の保証された最小値と一致します。

http://code.google.com/p/libjingle/source/browse/branches/nextsnap/talk/session/tunnel/pseudotcpchannel.cc?spec=svn17&r=13

于 2010-12-16T03:50:32.963 に答える
0

2014年以降、このリンクがこの質問に対する最良の回答になる可能性があります。

UdpClientクラス.NETリファレンスソース

private const int MaxUDPSize = 0x10000;  
...
private byte[] m_Buffer = new byte[MaxUDPSize];
于 2015-03-29T07:57:47.150 に答える