Niedawno zacząłem pisać trochę kodu C++, który używa gniazd, które chciałbym być asynchroniczne. Czytałem wiele postów o tym, jak można używać ankiet i wybierz, aby moje asynchroniczne gniazda (za pomocą ankiety lub wybierz, aby czekać na bufor wysyłania lub recv), ale na mojej stronie serwera mam tablicę struct pollfd, gdzie za każdym razem gniazdo nasłuchu akceptuje połączenie, dodaje je do tablicy struct pollfd, dzięki czemu może monitorować recv (POLLIN) gniazda.Czy istnieje lepszy sposób korzystania z asynchronicznych gniazd TCP w C++ zamiast ankiety lub wyboru?
Mój problem polega na tym, że gdybym miał 5000 gniazd połączonych z moim gniazdem nasłuchującym na moim serwerze, to tablica struktury pollfd miałaby rozmiar 5000, ponieważ monitorowałaby wszystkie podłączone gniazda, ALE jedyny sposób, jaki znam aby sprawdzić, czy recv dla gniazda jest gotowy, to poprzez zapętlenie wszystkich elementów w tablicy struct pollfd, aby znaleźć te, których revents równa się POLLIN. To wydaje się po prostu mało wydajne, gdy liczba podłączonych gniazd jest bardzo duża. Czy jest lepszy sposób to zrobić?
W jaki sposób biblioteka boost :: asio obsługuje async_accept, async_send, etc ...? Jak mam sobie z tym poradzić?
Nie ma * boost * w [tag: c], należy zachować ostrożność przy wyborze tagów. –
Miksujesz "nieblokujące" i "asynchroniczne". Są to różne tryby. 'select()' i przyjaciele służą do niezablokowania operacji we/wy. Brzmi to tak, jakbyś potrzebował asynchronicznego I/O, w takim przypadku powinieneś użyć 'boost' lub przełączyć się na inny język, taki jak Java, który ma wbudowaną asynchronię. Ale tylko dla 5000 klientów nie powinieneś przeoczyć blokowania I/O z wątkami. – EJP
@EJP ... lub rozważ użycie ['std :: async()'] (http: //www.cplusplus.com/reference/future/async /) – Christophe