Piszę aplikację sieciową, która używa ASIO/UDP do wysyłania i odbierania między jedną parą zdalną/locale punktu końcowego. Użyłem polecenia udp :: socket :: receive do odbioru danych i wszystko w moim kodzie działało logicznie, ale traciłem ogromną liczbę pakietów. Odkryłem, że każdy odebrany pakiet, który nie został zablokowany w funkcji odbioru, został utracony - nie buforował. Było to szczególnie dziwne, bo ja ustawić bufor do 2MB otrzymane za pomocą następującego polecenia:Zwiększenie buforowania ASIO nie działa
sock_udp.connect(remote_endpoint);
sock_udp.set_option(boost::asio::socket_base::receive_buffer_size(2*1024*1024));
To oraz fakt, że jeśli wysłałem tylko dwa pakiety około 100 bajtów, by każdy nadal tracić drugi gdybym spędził w dowolnym momencie przetwarzanie pierwszego.
Doszedłem do wniosku, że być może jest to usterka z udp :: socket :: receive, więc ponownie napisałem swój kod sieciowy, aby użyć udp::socket::async_receive
, ale nadal mam ten sam problem. Oznacza to, że gdy mój program obsługi zostanie wywołany, usuwam wszystkie pakiety, dopóki nie wezwę ponownie async_receive.
Czy zasadniczo coś nie rozumiem? Czy istnieje inne podejście, które powinienem stosować, aby zwiększyć buforowanie przychodzących pakietów?
Jeśli to pomaga, sprawdziłem, że dzieje się to zarówno w systemie OS X w XCode przy użyciu ich niestandardowej wersji gcc4.2, jak i Ubuntu 10.10 przy użyciu gcc4.5. Nie mogłem go wypróbować w systemie Windows.
może możesz zamieścić pełniejszy przykład, trudno powiedzieć z Twojego opisu, co może być nie tak, użyłem 'boost :: asio :: async_read' z udp gniazdami i nie miałem problemów z upuszczaniem pakietów ... – Nim
, jak powiedział Nim, powinieneś opublikować więcej kodu, aby dać nam lepszy pomysł na strukturę Twojego programu. –