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(); 
			} 
		} 
	} 
}