Mam wywołanie blokujące accept()
w wątku oczekującym na żądania połączenia. Gdy aplikacja ma się zamknąć, chcę zasygnalizować wątek oczekujący na accept()
, aby wyjść z wdziękiem. Znalazłem w dokumentacji dla Winsock, że mogę ustawić wartość limitu czasu dla send()
i recv()
, ale nie mogę tego zrobić dla accept()
.Jak wyjść z funkcji blokowania accept() w systemie Windows?
Przeczytałem, że mogę sprawić, że gniazdo nie będzie blokować i używać select()
i przekazać wartość limitu czasu dla select()
, ale szukam rozwiązania dla blokowania gniazd.
AFAIK nie można ... a przynajmniej nie "starszych" (pre-Vista)? Windows. –
Nie musisz przełączać się na opcję bez blokowania, aby użyć opcji 'select()', można jej również używać z gniazdami blokującymi. Wywołaj 'select()' z limitem czasu i nie wywołuj 'accept()', chyba że 'select()' mówi, że połączenie oczekuje na akceptację. W przeciwnym razie tak, przełącz się na nieblokowanie. Możesz użyć 'WSAEventSelect()' z 'WSAWaitForMultipleEvents()', aby oczekiwać na zdarzenia gniazda i zdarzenie zakończenia w tym samym czasie. Lub użyj portu zakończenia we/wy dla zdarzeń gniazd i w razie potrzeby umieść zdarzenie zakończenia. –
CancelSynchronousIo() może również być szybką i łatwą łatką. –