c - Winsock acceptere timeout

Indlæg af Hanne Mølgaard Plasc

Problem



Er det muligt at indstille timeout til accept -funktionen, når du bruger blokering af winsockets? Som vi kan gøre for at recv og sende funktion via setsockopt?


Det ser ud som om det ikke er muligt, men jeg vil sikre.

Bedste reference


Vælg funktion kan bruges med timeout. Selvom vælg er mest almindeligt anvendt med ikke-blokkerende stik, har jeg ikke læst noget, der forhindrer at passere en blokeringsterminal til at vælge. Hvis vælgfunktionen udløber, har du adfærd svarende til accept timeout.


Fra MSDN [1]


'Parameterværdierne identificerer de stik, der skal kontrolleres for læsbarhed. Hvis stikket er i øjeblikket i listen tilstand, vil det blive markeret som læsbart, hvis en indgående forbindelsesforespørgsel er blevet modtaget, således at en acceptere er garanteret at afslutte uden at blokere . For andre stikkontakter betyder læsbarhed, at kødata er tilgængelige for læsning, således at et opkald til recv, WSARecv, WSARecvFrom eller recvfrom garanteres ikke at blokere. '


Dette bør give dig den adfærd, du forventer.

Andre referencer 1


Det er ret nemt at arrangere en anden tråd for at lukke lytte sokkel afer en timeout. Opret en automatisk nulstillingshændelse og signalér det, når du accepterer () returnerer. Skriv en funktion, der venter på arrangementet med WaitForSingleObject () i en loop med timeout interval. Hvis WFSO vender tilbage med noget, der ikke WAIT\_OBJECT\_0, skal du lukke lyttekontakten og afslutte. Lige før du går ind i accept () loop, skal du oprette en tråd for at ringe til funktionen.


En anden mulighed er at bruge acceptEx () og vente med en WFSO () timeout på en begivenhed, der er bestået som hEvent for OVERLAPPED struct. Hvis timeouten brænder, skal du bruge CancelIo () for at fjerne køen acceptEx () færdiggørelse fra netværks-IO-systemet.