Przepełnienie bufora serwera UDP

Piszę aplikację C ++ na Linuksie. Moja aplikacja ma serwer UDP, który wysyła dane do klientów na niektórych wydarzeniach. Serwer UDP odbiera również pewne informacje zwrotne / potwierdzenia od klientów.

Do wdrożenia tej aplikacji użyłem pojedynczego gniazda UDP (np.int fdSocket) wysyłać i odbierać dane od wszystkich klientów. Powiązałem to gniazdo z portem 8080 i ustawiłem gniazdo w tryb NON_BLOCKING.

Stworzyłem dwa wątki. W jednym wątku czekam na jakieś zdarzenie, jeśli wystąpi zdarzenie, używam fdsocket do wysyłania danych do wszystkich klientów (w pętli for).

W innym wątku używamfdSocket odbierać dane od klientów (recvfrom()). Ten wątek ma być uruchamiany co 4 sekundy (tzn. Co 4 sekundy będzie dzwonił)recvfrom() pobrać dane z bufora gniazda. Ponieważ jest w trybie NON-BLOCKINGrecvfrom() funkcja powróci natychmiast, jeśli żadne dane UDP nie będą dostępne, wtedy przejdę w stan uśpienia na 4 sekundy).

Informacja zwrotna / potwierdzenie UDP od wszystkich klientów ma stały ładunek, którego rozmiar wynosi 20 bajtów.

Teraz mam dwa pytania związane z tą implementacją:

Czy poprawne jest używanie tego samego gniazda do wysyłania / odbierania danych UDP z klientami Mulitiple?Jak znaleźć maksymalną liczbę pakietów UDP Feedback / Acknowledge Packets, które moja aplikacja może obsłużyć bez przepełnienia bufora gniazda UDP (ponieważ czytam co 4 sekundy, jeśli otrzymam dużo pakietów w ciągu 4 sekund, mogę stracić część pakietu, tzn. Potrzebuję znaleźć stawkę w pakietach na sekundę, którą mogę bezpiecznie obsłużyć)?

Próbowałem pobrać rozmiar gniazda Socket Buffer dla mojego gniazda (fdsocket) za pomocą wywołania funkcjigetsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);. Z tej funkcji odkrywam, że mój rozmiar bufora gniazda to 110592. Ale nie jestem pewien, jakie dane będą przechowywane w tym buforze gniazda: czy będzie on przechowywać tylko ładunek UDP lub cały pakiet UDP lub zdarzenie Cały pakiet Ethernet? Odniosłem się do tegopołączyć uzyskać jakiś pomysł, ale pomyliłem się.

Obecnie mój kod jest trochę brudny, wyczyszczę i opublikuję wkrótce.

Oto linki, o których wspomniałem przed wysłaniem tego pytania.

Sieci LinuxUDP SentTo i Recvfrom Max Buffer SizeUDP Socket Buffer Overflow DetectionTransmisja UDP i emisja pojedyncza przez to samo gniazdo?Wysyłanie z tego samego gniazda UDP w wielu wątkachJak opróżnić bufor wejściowy gniazda UDP w C?Jak znaleźć rozmiar bufora gniazda linuxJak uzyskać ilość danych oczekujących dla gniazda UDP?

questionAnswers(3)

yourAnswerToTheQuestion