www.pudn.com > IOCPNet_Demo.zip > IOCPNetTest.cpp


//////////////////////////////////////////////////////////////////////////////////////////////////// 
//	Module Name: 
//		IOCPNetTest.cpp 
//	Author: 
//		Chun-Hyok, Chong. 
//	Description: 
//		IOCPNet test code. 
//////////////////////////////////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "workframe.h" 
#include "WorkframeReturnCode.h" 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include "IOCPNet.h" 
 
#define TEST_IP										"127.0.0.1" // change it! 
#define TEST_PORT									20000 
 
#define TEST_LOG_PATH								"c:\\\\testlog\\log.txt" 
 
#define WAIT_TIMEOUT_TEST							100 
 
DWORD WINAPI LogicThread(void *pParam); 
void MainLogic(OIOCPNet *pIOCPNet, DWORD SocketUnique, OBufferedSocket *pBuffSock, BYTE *pReadData, DWORD ReadSize); 
 
DWORD g_dRunning; 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
	OErrLog EL; 
	OIOCPNet *pIOCPNet; 
	int key; 
	WSADATA WSAData; 
	HANDLE hThread; 
 
	WSAStartup(MAKEWORD(2,2), &WSAData); 
 
	EL.SetErrLogFile(TEST_LOG_PATH); 
 
	pIOCPNet = new OIOCPNet(&EL); 
	pIOCPNet->Start(TEST_IP, TEST_PORT); 
	 
	InterlockedExchange((long *)&g_dRunning, 1); 
 
	hThread = CreateThread(0, 0, LogicThread, pIOCPNet, 0, 0); 
	if (0 == hThread) 
	{ 
		printf("CreateThread is failed. Error code = %d\n", GetLastError()); 
		goto ErrHand; 
	} 
 
	printf("Server: Press any key to stop...\n"); 
	key = getch(); 
 
	InterlockedExchange((long *)&g_dRunning, 0); 
	WaitForSingleObject(hThread, INFINITE); 
 
ErrHand: 
	pIOCPNet->Stop(); 
	delete pIOCPNet; 
 
	WSACleanup(); 
 
	return 0; 
} // _tmain() 
 
DWORD WINAPI LogicThread(void *pParam) 
{ 
	int iRes; 
	OIOCPNet *pIOCPNet; 
	int EventType; 
	DWORD SocketUnique; 
	BYTE *pReadData; 
	DWORD ReadSize; 
	OBufferedSocket *pBuffSock; 
	OReadSlotElement *pSlot; 
	void *pCustData; // for formatting. no custom data is used in this test. 
 
	pIOCPNet = (OIOCPNet *)pParam; 
 
	while (1 == InterlockedExchange((long *)&g_dRunning, g_dRunning)) 
	{ 
		iRes = pIOCPNet->GetSocketEventData(WAIT_TIMEOUT_TEST, &EventType, &SocketUnique, &pReadData, &ReadSize, &pBuffSock, &pSlot, &pCustData); 
		if (RET_TIMEOUT == iRes) 
		{ 
			continue; 
		} 
		else if (RET_FAIL == iRes) 
		{ 
			return 0; 
		} 
		else if (RET_SOCKET_CLOSED == iRes) 
		{ 
			// release pCustData. 
			continue; 
		} 
 
		// Process main logic. 
		MainLogic(pIOCPNet, SocketUnique, pBuffSock, pReadData, ReadSize); 
		 
		pIOCPNet->ReleaseSocketEvent(pSlot); 
	} 
 
	return 0; 
} // LogicThread() 
 
void MainLogic(OIOCPNet *pIOCPNet, DWORD SocketUnique, OBufferedSocket *pBuffSock, BYTE *pReadData, DWORD ReadSize) 
{ 
	//printf("pReadData = %s\n", pReadData); 
	pIOCPNet->WriteData(SocketUnique, pBuffSock, pReadData, ReadSize); // echo. 
 
	return; 
} // MainLogic()