2012-07-20 16 views
5

Zrobiłem mój serwer UDP i klienta z boost :: asio udp gniazda. Wszystko wyglądało dobrze, zanim zacząłem wysyłać więcej datagramów. Przychodzą poprawnie od klienta do serwera. Ale są zjednoczeni w moim buforze w jedną wiadomość.Jak podzielić otrzymane z boost asio udp gniazda united datagramy

użyć

udp::socket::async_receive z std::array<char, 1 <<18> buforze

do wykonywania żądania transmisji asynchronicznej. I odbieranie danych poprzez oddzwonienie

void on_receive(const error_code& code, size_t bytes_transferred)

Gdybym wysyłać dane zbyt często (co 10 milisekund) Otrzymuję kilka datagramów równocześnie do mojego bufora z zwrotnego powyżej. Pytanie brzmi - jak je oddzielić od? Uwaga: moje datagramy UDP mają o zmiennej długości. Nie chcę używać nagłówka dodatkowego o rozmiarze, ponieważ spowoduje on, że mój kod będzie bezużyteczny dla datagramów firm trzecich.

+0

Czy możesz pokazać swój kod? –

+0

Użyj funkcji zwrotnej dostarczonej przez użytkownika w wiadomości 'on_receive', która przetwarza wszystkie zawarte wiadomości w pojedynczym odebranym pakiecie. – Chad

+0

Oczywiście, można go znaleźć tutaj: [udp2tcp_tunnel] (https://github.com/valery-l/udp2tcp_tunnel). Trwa to - jeszcze trochę ping-ponga (wysyłanie przez TCP z klienta, otrzymywanie tej samej wiadomości testowej z serwera od UDP). Wydaje mi się, że znalazłem problem. Jeśli wyślę kilka buforów w ** sekwencji buforowej ** przez 'basic_datagram_socket :: async_send_to (buffer_sequence, handler)', przyjdzie on jako ** jeden ** datagram (nie ** jeden ** datagram dla ** każdego bufora * *). –

Odpowiedz

0

Uważam, że jest to ograniczenie w sposobie zwiększania :: asio w przypadku bezpaństwowych strumieni danych. Zauważyłem dokładnie to samo zachowanie podczas używania boost :: asio dla interfejsu szeregowego. Kiedy wysyłałem pakiety ze stosunkowo dużymi przerwami, otrzymywałem każdy w osobnym oddzwanianiu. Gdy rozmiar pakietu wzrastał, a przerwa między pakietami zmniejszała się, osiągnęła etap, w którym wywoływałoby to oddzwanianie tylko wtedy, gdy bufor był pełny, a nie po odebraniu pojedynczego pakietu.

Jeśli dokładnie znasz rozmiar oczekiwanych datagramów, to rozwiązanie polegające na ograniczeniu rozmiaru bufora wejściowego jest bardzo rozsądne, ponieważ wiesz dokładnie, jak duży musi być bufor.

Jeśli twoje przeciążenie pochodzi od wysyłania wielu różnych typów pakietów, więc nie możesz wstępnie przydzielić bufora o właściwym rozmiarze, możesz potencjalnie utworzyć różne gniazda dla różnych portów dla każdego rodzaju transakcji. To trochę bardziej "hacky", ale biorąc pod uwagę praktycznie nieograniczoną naturę efemerycznej dostępności portów, o ile nie używasz 20 000 różnych typów pakietów, które prawdopodobnie pomogłyby Ci jak dobrze.

Powiązane problemy