W moim programie jest jeden wątek (odbierający wątek), który jest odpowiedzialny za odbieranie żądań z gniazda TCP i istnieje wiele wątków (wątków roboczych), które są odpowiedzialne za przetwarzanie odebranych upraszanie. Po przetworzeniu żądania muszę wysłać odpowiedź przez TCP.Jak anulować oczekiwanie w select() na Windows
Tutaj jest pytanie. Chciałbym wysłać dane TCP w tym samym wątku, którego używam do odbierania danych. Ten wątek po otrzymaniu danych zwykle czeka na nowe dane w select()
. Tak więc, gdy wątek roboczy zakończy przetwarzanie żądania i umieści odpowiedź w kolejce wyjściowej, musi zasygnalizować wątkowi odbierającemu, że istnieją dane do wysłania. Problem polega na tym, że nie wiem, jak anulować czekanie w select()
, aby wyjść z oczekiwania i zadzwonić pod numer send()
.
Czy mogę użyć innego wątku wyłącznie do wysyłania danych przez TCP?
Updated
MSalters, Artem dziękuję za was odpowiedzi!
MSaltery, po przeczytaniu odpowiedzi znalazłem tę stronę: Winsock 2 I/O Methods i przeczytałem o WSAWaitForMultipleEvents()
. Mój program w rzeczywistości musi działać zarówno na HP-UX, jak i na Windowsie. W końcu zdecydowałem się na podejście zaproponowane przez Artema.
Dlaczego używasz 'select()' do pisania? Zazwyczaj 'select()' tylko czeka na odebrane dane, i możesz 'wysłać()' danych za pomocą tych samych gniazd w międzyczasie. – ereOn
Nie, nie używam opcji wyboru do zapisu. Czy ja to powiedziałem? –
@skwllsp: Założę się, ponieważ wydaje się, że chcesz anulować 'select()', aby napisać do twojego gniazda, co nie jest konieczne. Ale może źle zrozumiałem całość, mój angielski nie jest dokładnie rodzimy. – ereOn