Znikające ramki w transmisji UDP

0

Wysyłam udp'y:

    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?

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
4

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

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.

0

Dzięki za podpowiedzi.

Ustawiałem rozmiar buffora w ten sposób

UdpSrv.BufferSize := PIERDYLION;  

zmieniłem na:

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

i teraz działa.

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.

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.