c - Windows - Vent på hændelse og stikkontakt simuleret

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver Win32-API C-kode, der skal vente på nye TCP-forbindelser og på den anden side kan til enhver tid lukkes af enhver anden proces/tråd.


Derfor skal jeg på en eller anden måde WaitForSingleObject på stophændelsen og vente på forbindelser med WSAAccept samtidigt.


Jeg prøvede WaitForMultipleObjects på både stikkontakten og håndteringen, men den nye forbindelse blev ikke udløst af funktionen (også WaitForSingleObject på stikkontakten vil ikke blive udløst på en ny forbindelse).


Enhver ide?

Bedste reference


Du skal bruge WSAWaitForMultipleEvents. Til stikkontakter, her er nogle pseudokoder: [10]


HANDLE hEvent[1];
hEvent[0] = WSACreateEvent();
WSAEventSelect(hSocket, hEvent[0], FD\_READ | FD\_WRITE);

while (WSAWaitForMultipleEvents(...)) {
    if (WSAEnumNetworkEvents(...)) { // Multiple events max exist
        if (... & FD\_ACCEPT) {
        }
        if (... & FD\_WRITE) {
        }
        ....
    }
}


Hvis du bruger flere begivenheder (f.eks. En stophændelse til at signalere tråden for at stoppe), skal du bruge returværdien fra WSAWaitForMultipleEvents til at bestemme den signalerede hændelse (som du gør med WaitForMultipleObjects).

Andre referencer 1


Du kan ikke vente på sokkelhåndtag direkte.


WSAAccept() er synkron, den eneste måde at afbryde er at lukke lytte socket.


Hvad du forsøger at gøre, skal du bruge AcceptEx() i stedet, som er asynkron og understøtter overlappede I/O- og I/O-kompletionsporte.


Hvis du bruger Overlappede I/O, kan du tilknytte et standard Win32-hændelsesobjekt til hver overlappet I/O-hukommelsesdrift (AcceptEx(), WSARecv(), WSASend() osv. Og bruge en standard Win32 hændelsesobjekt til din stophændelse. Og så kan du bruge en WaitForMultipleObjects() løkke for at vide, hvilken hændelse der signaleres og handle i overensstemmelse hermed.


Hvis du bruger en I/O-afslutningsport, behøver du slet ikke begivenhedsobjekter. Du kan knytte hver stik til en enkelt IOCP-kø, og din IOCP-handler (enten et opkald til GetQueuedCompletionStatus() eller en tilbagekaldsfunktion) vil blive underrettet, når hver IOCP-kompatibel stikkontakt er færdig. Du kan derefter bruge PostQueuedCompletionStatus() til at sende en brugerdefineret stopbesked til IOCP-køen. Du kan handle i overensstemmelse hermed ud fra hvilken slags begivenhed den modtager.