Beste mensen, ik ben bezig met een winsock programmatje en ondervindt een probleem met het zogenaamde 'blocking-' en 'non-blocking' mode.
Ik laat mijn programma namelijk weten doormiddel van message-mappen wanneer er een zogenaamde 'winsock event' gebeurd...
Dus wanneer windows een FD_CLOSE message stuurt, weet ik dat de verbinding tussen de server en de client verbroken is... De socket is dan niet meer geldig...
Vervolgens wil ik de socket opnieuw laten wachten op een inkomende verbinding,
maar het probleem is dat WSAAsyncSelect() de socket op non-blockingmode heeft gezet.
Dus ik kan niet zomaar een accept() functie erin gooien en wachten totdat de client weer een verbinding probeert aan te gaan: de functie zal de macro WSAWOULDBLOCK retourneren.
Dus ik maar op de MSDN zoeken hoe ik een socket die met de functie WSAAsyncSelect is aangeroepen terug kan zetten naar blocking-mode...
MSDN zegt me dat ik dan het volgende moet doen:
WSAAsyncSelect (hRemoteSocket,hwnd,1111,0); ioctlsocket(hRemoteSocket,FIONBIO,NULL);
Dat wil zeggen: WSAAsyncselect() nogmaals aanroepen op de socket en dit keer met een 0 als event parameter, en vervolgens ioctlsocket() aanroepen op de socket.
Resultaat bij mij: De socket blijft op non-blocking mode staan.... hij moet dus naar blocking mode.
Wie o wie kan mij helpen? Want dit is voor de meeste geen simpele vraag.
Ik laat mijn programma namelijk weten doormiddel van message-mappen wanneer er een zogenaamde 'winsock event' gebeurd...
Dus wanneer windows een FD_CLOSE message stuurt, weet ik dat de verbinding tussen de server en de client verbroken is... De socket is dan niet meer geldig...
Vervolgens wil ik de socket opnieuw laten wachten op een inkomende verbinding,
maar het probleem is dat WSAAsyncSelect() de socket op non-blockingmode heeft gezet.
Dus ik kan niet zomaar een accept() functie erin gooien en wachten totdat de client weer een verbinding probeert aan te gaan: de functie zal de macro WSAWOULDBLOCK retourneren.
Dus ik maar op de MSDN zoeken hoe ik een socket die met de functie WSAAsyncSelect is aangeroepen terug kan zetten naar blocking-mode...
MSDN zegt me dat ik dan het volgende moet doen:
WSAAsyncSelect (hRemoteSocket,hwnd,1111,0); ioctlsocket(hRemoteSocket,FIONBIO,NULL);
Dat wil zeggen: WSAAsyncselect() nogmaals aanroepen op de socket en dit keer met een 0 als event parameter, en vervolgens ioctlsocket() aanroepen op de socket.
Resultaat bij mij: De socket blijft op non-blocking mode staan.... hij moet dus naar blocking mode.
Wie o wie kan mij helpen? Want dit is voor de meeste geen simpele vraag.