Code Snippet
DWORD WINAPI workerThread(LPVOID lParam)
{
DWORD dwBytesTransfered = 0, *lpNumberOfBytesRecvd, *lpFlags = 0;
void *lpContext = NULL;
OVERLAPPED *pOverlapped = NULL;
LPPER_HANDLE_DATA lpHandleData = NULL;
int nResult;
WSABUF wsaBuf;
char buffer[MAX_BUFFER_LEN];
//memset(&buffer, 0, MAX_BUFFER_LEN);
//memset(&wsaBuf, 0, sizeof(wsaBuf));
wsaBuf.len = MAX_BUFFER_LEN;
wsaBuf.buf = buffer;
while(1)
{
//printf("DEBUG %d\n", GetLastError());
nResult = GetQueuedCompletionStatus(g_hCompletionPort, &dwBytesTransfered,(LPDWORD)&lpContext, &pOverlapped, 10000);
if(nResult == FALSE || ((nResult == TRUE) && (dwBytesTransfered == 0)))
{
printf("GetQueuedCompletionStatus ERROR : %d\n", GetLastError());
if(GetLastError() != 0) // application has completed successfully
continue;
}
lpHandleData = (LPPER_HANDLE_DATA) lpContext;
printf("Bytes transfered : %d\n", dwBytesTransfered);
switch(lpHandleData->opCode)
{
case OP_READ:
printf("Total bytes received : %d\n", wsaBuf.len);
printf("Data received :\n%s\n",wsaBuf.buf);
break;
case OP_CONNECT: // just connected to the server
printf("Connected\n");
lpHandleData->opCode = OP_READ;
printf("DEBUG %d\n", GetLastError());
memset(&lpHandleData->ol, 0, sizeof(lpHandleData->ol));
if(WSARecv(lpHandleData->serverSocket, &wsaBuf, 1, lpNumberOfBytesRecvd, lpFlags, &lpHandleData->ol, NULL) == SOCKET_ERROR)
if(WSAGetLastError() == WSA_IO_PENDING)
printf("WSARecv WSA_IO_PENDING\n");
else
/***************************ERROR 10014 WSAEFAULT **********************
printf("WSARecv ERROR : %d\n", WSAGetLastError());
break;
}
}
return 0;
}