Wybudzenie wątku po nadejściu danych do gniazda

0

Klasyczny klient - serwer. Problem dotyczy wątków po stronie serwera.

Mam główny wątek akceptujący klientów i dla każdego klienta rozpoczyna się jego własny wątek (sesja) do komunikacji. Teraz mam taki problem, jeżeli aktualnie nie ma wymiany pomiędzy serwerem a klientem to wątek klienta oczekuje na pojawienie się jakichś danych. Najbardziej sensowne wydaje się wtedy uśpienie wątku (Sleep(Timeout.Infinite)).

Moje pytanie brzmi czy jest jakas możliwość żeby wątek sam się wybudził po pojawieniu się czegoś w gnieździe ?
Mógłbym stworzyć "trzeci" wątek który sprawdzałby gniazda klientów po kolei i jeżeli coś się na którymś pojawiło to budziłby jego wątek, ale taka nieskończona pętla (musiałaby działać tak długo jak długo działałby serwer i obciążałaby system) jakoś mi nie bardzo leży. Równie złym rozwiązaniem byłaby pętla w każdym wątku klienta sprawdzająca dostępność danych ( bez usypiania wątka).

0

jeśli masz gniazda blokujące to w pętli robisz

while (true)
{
dane = gniazdo.recv(); //nie pamieteam jak się nazywa metoda odbierające dane z gniazda
}

trzeba tylko jeszcze zrobić try catch na timeout i tyle - wątek dopóki nie ma danych lub timeout i tak stoi i nic nie robi.

A jak masz gniazda nieblokujące to po co Ci wątki?

0

Ok, teraz już coś niecoś wiem.

Teraz trochę z innej beczki: jakiego typu gniazd lepiej użyć ? Są jakieś (przeciw)wskazania żeby w jednych zastosowaniach używać gniazd blokujących a w innych nieblokujących ? Czy wybór należy jedynie do mnie i któych jest mi wygodniej użyć tych używam ?

Coś staram się znaleźć na ten temat w googlach ale póki co nic nie ma interesującego..

0

na pewno ma to znaczenie przy większej ilości połączeń (idące w setki czy tysiące) ale dla kilkunastu/dziesięciu raczej nie będzie miało większego znaczenia

0

rozumiem, że przy większej liczbie połączeń lepiej użwać wątków i gniazd blokujących ?

0

tu już trzeba trochę więcej zachodu bo max liczba otwartych połączeń jest skończona i zdeterminowana przez system.
o ile dobrze pamiętam to kiedyś na forum była dyskusja o tym

0

Zainteresuj się metodami xxxAsync (Send, Receive, Accept), jest wiele tutoriali co do jego użycia (a te microsoftowe są jednymi z gorszych, imo)

Mogą pojawić się problemy podczas synchronizacji (np. chcesz żeby pakiety wychodziły w kolejności tymczasem wszystko sie miesza, bo wysyłanie jest asynchroniczne (mniejsze wyjdą do sieci szybciej)), wyppadałoby napisać własną klasę która zarządza wysyłaniem, ale to już na Twojej głowie :P.

Co do wydajności - nie ma problemów z wątkami, o których wspomniano wyżej.

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