ID: Q94088
I have set a WSAAsyncSelect() call to notify me of read (FD_READ) and disconnection (FD_CLOSE). When a read call is posted on my message queue, I continually read from the socket until there are no more characters waiting. After each read, I use a select() call to determine if more data needs to be read. However, after a while, the notifications stop coming. Why is this?
The message queue must be cleared of extraneous notification messages for each read notification message.
Call WSAAsyncSelect( sockt, hWnd, 0, 0) to clear the message queue for each read notification.
WSA_READCLOSE:
if (WSAGETSELECTEVENT( lParam ) == FD_READ) {
FD_ZERO( &readfds );
FD_SET( sockt, &readfds);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
/* Clear the queue of any extraneous notification messages. */
WSAAsyncSelect( sockt, hWnd, 0, 0);
while (select(0, &readfds, NULL, NULL, &timeout) != 0) {
recv(sockt, &ch, 1, 0);
}
/* Reset the message notification. */
WSAAsyncSelect( sockt, hWnd, WSA_READCLOSE, FD_READ | FD_CLOSE);
}
Additional query words:
Keywords : kbnetwork kbAPI kbNTOS310 kbNTOS350 kbNTOS351 kbNTOS400 kbSDKPlatform kbWinOS310 kbWinOS95 kbWinsock kbGrpNet
Issue type : kbprb
Last Reviewed: July 31, 1998