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