Afbrydelse af en tilslutningsvindues wsa-stikkontakt

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg spekulerede bare på, om det er muligt at afbryde opkald til Windows-sokkel 'connect' -funktion?


Problemet er, at min kode kræver, at det gøres i en anden tråd (så GUI-tråd fortsætter med at køre). Men når programmet er lukket, er der stadig tråde, der kalder 'connect', der venter på en WSAETIMEDOUT-undtagelse.


Nogle ideer?


Opdatering/Hint: Jeg kan ikke ringe tæt (), da jeg kun har et gyldigt håndtag, når forbindelsen () vender tilbage. sidstnævnte er ikke tilfældet ved brug af blokeringsstik og har en tcp-forbindelse til en firewalled-placering (for eksempel):/

Bedste reference


Hvis stikket er i blokeringsfunktion, er den eneste måde at afbryde connect() opkald at lukke stikket fra en anden trådkontekst end den, der ringer connect(). connect() vil returnere en fejl, og tråden kan derefter afslutte sig normalt.


Hvis stikket ikke er i blokering eller overlappet tilstand, returneres connect() straks med en WSAEWOULDBLOCK fejl, og du skal derefter ringe til select(), WSAAsyncSelect(FD\_CONNECT) eller WSAEventSelect(FD\_CONNECT) for at opdage, hvornår forbindelsen er etableret, inden du fortsætter med dit stikkontakt. Da opkaldstråden ikke er blokeret på connect(), er det gratis at jævnligt tjekke for eventuelle opsigelses-/afbrydelsessignaler fra resten af ​​din kode, og hvis det er registreret, skal du lukke stikket (hvis nødvendigt) og afslutte normalt.


Hvis du skriver din stikkontaktkode i ikke-blokkerende eller overlappede tilstand, behøver du ikke rigtig at bruge en tråd. Du kan gøre dit stikkontakt i hovedtråden uden at blokere dit brugerinterface, så du kan bare lukke stikkontakten, når det er nødvendigt. Det kræver lidt mere arbejde at kode på den måde, men det virker. Eller du kan fortsætte med at bruge en tråd. Det vil holde din socket kode adskilt fra din UI-kode og dermed lidt mere håndterbar.