www.pudn.com > using IOCP.zip > callback.cpp
// Written by Oz Ben Eliezer // o_be@hotmail.com // September, 2000 #define _WIN32_WINNT 0x0500 #include#include "client.h" #include "general.h" #include "callback.h" #include "commands.h" extern HANDLE dieEvent; void CALLBACK DoneIO(DWORD dwErrorCode, DWORD dwNumberOfBytesTransferred, LPOVERLAPPED lpOverlapped) { OVERLAPPED_PLUS *ov; CClient *client; int nCommand; if (0 == dwErrorCode) { ov = (OVERLAPPED_PLUS *)lpOverlapped; if (ov != NULL) { client = (CClient *)ov->client; if (0 != dwNumberOfBytesTransferred) { // Let's rock // First, see which type of operation completed: read or write. if (ov->bCtxWrite) { // Finished a send // Make sure that client is still connected. if (client->nState == STATE_CONNECTED) { client->EnterInUse(); client->bMayWrite = 1; // Operation completed. Allow // further sendings of data. if (client->bPendingWrite) { // There is still data to be written. client->NetWrite(); } client->LeaveInUse(); } } else { // Finished a read client->ShiftState(); // client->nRead was not set by ReadFile, because // the I/O wasn't performed synchroniously. Set it // ourselves. client->SetRead(dwNumberOfBytesTransferred); printf("\nReceived %d bytes.", dwNumberOfBytesTransferred); printf("\nStarting retrieval..."); static int nTotal = 0; int nCount = 0; while (client->Read()) { nCount++; nCommand = client->ProcessPacket(); if (nCommand == CMD_DISCONNECT) { // Disconnect client (probably because it has // done something illegal. client->Close(); client->Init(); break; } else if (nCommand == CMD_SHUTDOWN) { client->Close(); client->Init(); SetEvent(dieEvent); break; } } nTotal += nCount; printf("\nFinished retrieval..., got to %d packets, total: %d", nCount, nTotal); client->IssueNetRead(); } } else { // Client as disconnected. client->Close(); client->Init(); } } } }