Mam problemy z UdpClient w języku C#. Przesyłam strumieniowo dźwięk przez Internet między dwoma klientami.UdpClient - ograniczone buforowanie?
Na moim mikrofonie, z częstotliwością próbkowania 16 kHz, wysyłam pakiety UDP z dźwiękiem z 6400 bajtami na pakiet. Te nigdy się nie przedostają, z wyjątkiem ostatniego pakietu, który wynosi około 1200-3400, odkąd zamknę nagranie. Po obniżeniu częstotliwości próbkowania do 8 kHz wysyłam pakiety z 3200 bajtowym ładunkiem. Te zawsze przechodzą z jakiegoś powodu.
W zasadzie wszystko powyżej 3200 zostaje spartaczone (nie testowano dokładnej liczby, ale ...) dlaczego na tym polega? Myślałem, że wewnętrzny bufor UdpClient jest za mały czy coś w tym stylu? Ponieważ często przesyłam pakiety dźwiękowe.
otrzymują:
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());
}
}
nie mogę znaleźć żadnego oczywistego błędu. (Obiekt asyn dla funkcji ma wartość null btw, nie muszę używać obiektu stanu, ale nie powinien być z tym związany)
Wiem, że protokół UDP nie jest niezawodny, ale biorąc pod uwagę, że każdy pakiet o wielkości 3200 przechodzi przez i nie ma dla mnie rozmiaru 6400, szczególnie z maksymalnym rozmiarem, 64kb?
Wszelkie pomysły?
Z tym, że ten ruch przechodzi przez Internet, to brzmi jak to, co się dzieje. –
Aby się rozwinąć, pakiety IP większe niż MTU będą pofragmentowane. Jeśli wszystkie fragmenty dotrą do miejsca docelowego, zostaną one ponownie złożone w oryginalnym pakiecie IP (zawierającym oryginalny datagram UDP) przez warstwę IP.Jeśli nie wszystkie pojawią się, nie ma mechanizmu w UDP, aby zażądać retransmisji, więc cały datagram zostanie utracony. – EJP
Dziękuję, to jasne! – KaiserJohaan