Znikające ramki w transmisji UDP

Znikające ramki w transmisji UDP
m_Lesiu
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 138
0

Wysyłam udp'y:

Kopiuj
    SetLength( Buff, sizeOf( TFrameBinary ));
    for i := 0 to n do
    begin
      PrepareFrameToSend( frame );
      Move( frame.bin, Buff[0], sizeOf( frame.bin ));
      AClnt.SendBuffer( Buff );
    end;

do UDP servera dociera tyle ramek ile zmieści się w 8kb. Reszta ginie.
Próbowałem zwiększyć SizeBuffer Klienta i Servera, nie daje rezultatu.
Jeśli dołożę sleepa( 50 ) w pętli wtedy docierają wszystkie ramki.

Co zrobić, żeby dostać wszystkie ramki ale bez użycia sleepa czy timera?

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
3

wysylac asynchronicznie. Bo wysylasz ale wysylanie sie "konczy" i zaczynasz wysylac kolejny. Musisz uzyc tutaj wielowatkowosci i po prostu poczekac az watek sie skonczy z wysylaniem (zapewne taka komenta jak join) i wtedy wyslylasz kolejny. Wiec reasumujac

  1. tworzysz watek
  2. w tym watku wysylasz dane
  3. w glownym watku czekasz az ten utworzony watek zostanie skonczony (w miedzyczasie program powinien normalnie dzialac [nie powinien byc zamrozony])
  4. jezeli zostal zakonczony wracamy do punku 1 jezeli jest cos do wyslania
abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
4

jeśli musisz mieć pewność, że wszystkie doszły to zamień na TCP

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2

To co powiedział @fasadin lub zrób n buforów, więc każdy będzie wysyłany niezależnie.
Przy czym koniecznie poczytaj post wyżej od @abrakadaber, UDP nie gwarantuje dotarcia paczki.

m_Lesiu
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 138
0

Dzięki za podpowiedzi.

Ustawiałem rozmiar buffora w ten sposób

Kopiuj
UdpSrv.BufferSize := PIERDYLION;  

zmieniłem na:

Kopiuj
UdpSrv.Binding.SetSockOpt( Id_SOL_SOCKET, Id_SO_RCVBUF,  PIERDYLION );

i teraz działa.

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
0

Jakiś czas temu robiłem mechanizm przenoszący wzorce odcisków palca z jednego urządzenia biometrycznego do drugiego firmy ZKSoftware. Urządzenia te komunikowały się tylko po UDP. Próbowałem niemal wszystkiego i czegokolwiek bym nie robił przy bardzo dużej ilości danych zdarzało się, że i tak niektóre wzorce nie pojawiały się na drugim urządzeniu. Finalnie udało nam się ustalić, że w trakcie dużego obciążenia sieci niektóre pakiety po prostu nie trafiały do odbiorcy. Jedyna pewna metoda to przerobić to na TCP (jeśli masz możliwość). W mechanizmie opisanym wyżej skończyło się napisaniem nowego protokołu komunikacyjnego na urządzeniach.

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
0
m_Lesiu napisał(a):

Dzięki za podpowiedzi.

Ustawiałem rozmiar buffora (...) i teraz działa.

Do czasu. Jak już koledzy pisali UDP nie gwarantuje dotarcia wszystkich pakietów i stosuje się go wszędzie tam, gdzie jest to akceptowalne. Streamingi na przykład. Jeżeli zwiększy się obciążenie sieci, to możesz znowu tracić pakiety i zwiększanie bufora nic nie da. TCP natomiast gwarantuje dotarcie wszystkich danych lub zgłoszenie błędu i z tego powinieneś korzystać.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.