Socket - select vs pętla z recv.

0

Witam mam dość spory dylemat. Jakieś trzy tygodnie temu zaimplementowałem szkielet odbioru danych i nawiązywania połączeń. Działa to mniej więcej tak, że mam tablicę klientów i tablicę nowych połączeń i w pętli sprawdzam czy gniazdo nasłuchujące odebrało prośbę o połączenie jeśli tak to dodaję to nowe gniazdo do nowych połączeń. Następnym elementem pętli jest badanie czy nowe połączenia przeszły prawidłowo proces logowania jeśli tak to gniazdo jest dodawane do tablicy klientów. Ostatnim elementem pętli jest przejście po tablicy klientów i wywoływanie dla każdego klienta funkcji recv. Jeżeli dane przyszły to wykonuję żądanie, jeżeli nie to przeglądam następnych klientów i zaczynam pętle od nowa...
Zauważyłem jednak, że przy tworzeniu dużego servera wszyscy proponują użycie funkcji select.
Moje pytanie więc chyba powinno brzmieć czy funkcja recv jest aż tak mozolna?
W moim projekcie wykonuję wywoływanie recv dla każdego aktywnego gniazda. Zaletą takiego podejścia jest fakt, że wiem od kogo odebrałem wiadomość i mogę już pracować na danych klienta znajdujących się w pamięci.
Gdybym jednak użył funkcji select to musiał bym wykonywać dodatkowe prace związane ze struktura fd_set np memcpy(local_fd_set,master_fd_set,sizeof(master_fd_set)) - w sumie to nic strasznego. Jednak gdym odbierał dane od gniazd ustawionych w fd_set to musiał bym również w jakiś sposób szukać mojej struktury klienta. co już było by bardziej kosztowne. Każdy wątek przechowywał by info o około 500 klientach. Czy mógł by mi ktoś w takim razie coś poradzić? Czy powinienem zostać przy aktualnym systemie czy też modyfikować go na wersję select. Jeżeli modyfikować to w jaki sposób powinienem przechowywać dane struktury każdego klienta i w jaki sposób się do nich dostawać.

0

W sumie nie pomyślałem... Skoro i tak i tak muszę przejść po wszystkich gniazdach wywołując funkcję FD_ISSET, a gniazda przechowuję w strukturach, natomiast moja pętla przechodzi przez te wszystkie struktury to i dostęp do danych będę miał O(1). Pozostało pytanie czy select będzie szybszy...???

0

select() i recv() robią dwie różne rzeczy. Wszelkie operacje, jakie będziesz musiał wykonać po zgłoszeniu gotowości gniazda przez select(), będziesz wykonywał tylko w przypadku gdy gniazdo będzie gotowe.
Popatrz na to z innej strony. Z jakiegoś powodu select() istnieje i stosuje się go właśnie do takich rozwiązań.

BTW, jeśli to Unices, to jest jeszcze rodzina *poll()

1 użytkowników online, w tym zalogowanych: 0, gości: 1