资源简介

完成端口示例代码:IOCPExample_By_PiggyXP.rar

资源截图

代码片段和文件信息

#include “StdAfx.h“
#include “IOCPModel.h“
#include “MainDlg.h“

// 每一个处理器上产生多少个线程(为了最大限度的提升服务器性能,详见配套文档)
#define WORKER_THREADS_PER_PROCESSOR 2
// 同时投递的Accept请求的数量(这个要根据实际的情况灵活设置)
#define MAX_POST_ACCEPT              10
// 传递给Worker线程的退出信号
#define EXIT_CODE                    NULL


// 释放指针和句柄资源的宏

// 释放指针宏
#define RELEASE(x)                      {if(x != NULL ){delete x;x=NULL;}}
// 释放句柄宏
#define RELEASE_HANDLE(x)               {if(x != NULL && x!=INVALID_HANDLE_VALUE){ CloseHandle(x);x = NULL;}}
// 释放Socket宏
#define RELEASE_SOCKET(x)               {if(x !=INVALID_SOCKET) { closesocket(x);x=INVALID_SOCKET;}}



CIOCPModel::CIOCPModel(void):
m_nThreads(0)
m_hShutdownEvent(NULL)
m_hIOCompletionPort(NULL)
m_phWorkerThreads(NULL)
m_strIP(DEFAULT_IP)
m_nPort(DEFAULT_PORT)
m_pMain(NULL)
m_lpfnAcceptEx( NULL )
m_pListenContext( NULL )
{
}


CIOCPModel::~CIOCPModel(void)
{
// 确保资源彻底释放
this->Stop();
}




///////////////////////////////////////////////////////////////////
// 工作者线程:  为IOCP请求服务的工作者线程
//         也就是每当完成端口上出现了完成数据包,就将之取出来进行处理的线程
///////////////////////////////////////////////////////////////////

DWORD WINAPI CIOCPModel::_WorkerThread(LPVOID lpParam)
{    
THREADPARAMS_WORKER* pParam = (THREADPARAMS_WORKER*)lpParam;
CIOCPModel* pIOCPModel = (CIOCPModel*)pParam->pIOCPModel;
int nThreadNo = (int)pParam->nThreadNo;

pIOCPModel->_ShowMessage(“工作者线程启动,ID: %d.“nThreadNo);

OVERLAPPED           *pOverlapped = NULL;
PER_SOCKET_CONTEXT   *pSocketContext = NULL;
DWORD                dwBytesTransfered = 0;

// 循环处理请求,知道接收到Shutdown信息为止
while (WAIT_object_0 != WaitForSingleobject(pIOCPModel->m_hShutdownEvent 0))
{
BOOL bReturn = GetQueuedCompletionStatus(
pIOCPModel->m_hIOCompletionPort
&dwBytesTransfered
(PULONG_PTR)&pSocketContext
&pOverlapped
INFINITE);

// 如果收到的是退出标志,则直接退出
if ( EXIT_CODE==(DWORD)pSocketContext )
{
break;
}

// 判断是否出现了错误
if( !bReturn )  
{  
DWORD dwErr = GetLastError();

// 显示一下提示信息
if( !pIOCPModel->HandleError( pSocketContextdwErr ) )
{
break;
}

continue;  
}  
else  
{  
// 读取传入的参数
PER_IO_CONTEXT* pIoContext = CONTAINING_RECORD(pOverlapped PER_IO_CONTEXT m_Overlapped);  

// 判断是否有客户端断开了
if((0 == dwBytesTransfered) && ( RECV_POSTED==pIoContext->m_OpType || SEND_POSTED==pIoContext->m_OpType))  
{  
pIOCPModel->_ShowMessage( _T(“客户端 %s:%d 断开连接.“)inet_ntoa(pSocketContext->m_ClientAddr.sin_addr) ntohs(pSocketContext->m_ClientAddr.sin_port) );

// 释放掉对应的资源
pIOCPModel->_RemoveContext( pSocketContext );

  continue;  
}  
else
{
switch( pIoContext->m_OpType )  
{  
 // Accept  
case ACCEPT_POSTED:


// 为了增加代码可读性,这里用专门的_DoAccept函数进行处理连入请求
pIOCPModel->_DoAccpet( pSocketContext pIoContext );

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    I.A....     21877  2011-08-30 12:40  PiggyIOCPServer_2008\PiggyIOCPServer\IOCPModel.cpp

     文件       8164  2011-08-30 12:40  PiggyIOCPServer_2008\PiggyIOCPServer\IOCPModel.h

     文件       4950  2011-08-30 12:40  PiggyIOCPServer_2008\PiggyIOCPServer\MainDlg.cpp

     文件       1446  2010-12-28 15:20  PiggyIOCPServer_2008\PiggyIOCPServer\MainDlg.h

     文件      59672  2009-10-07 00:29  PiggyIOCPServer_2008\PiggyIOCPServer\PiggyIOCPServer.aps

     文件       1709  2009-09-30 10:19  PiggyIOCPServer_2008\PiggyIOCPServer\PiggyIOCPServer.cpp

     文件        497  2009-10-06 15:53  PiggyIOCPServer_2008\PiggyIOCPServer\PiggyIOCPServer.h

     文件       5804  2009-10-07 00:29  PiggyIOCPServer_2008\PiggyIOCPServer\PiggyIOCPServer.rc

     文件       5878  2010-12-28 15:05  PiggyIOCPServer_2008\PiggyIOCPServer\PiggyIOCPServer.vcproj

     文件       1413  2009-10-09 17:10  PiggyIOCPServer_2008\PiggyIOCPServer\PiggyIOCPServer.vcproj.HAOTHINK.Hao Wang.user

     文件       1419  2011-02-28 18:04  PiggyIOCPServer_2008\PiggyIOCPServer\PiggyIOCPServer.vcproj.HAOWANGBOOK.Thinkpad.user

     文件       1405  2010-09-01 02:03  PiggyIOCPServer_2008\PiggyIOCPServer\PiggyIOCPServer.vcproj.MYPC.Piggy.user

     文件       2723  2009-09-30 10:19  PiggyIOCPServer_2008\PiggyIOCPServer\ReadMe.txt

     文件      21630  2003-07-23 17:52  PiggyIOCPServer_2008\PiggyIOCPServer\res\PiggyIOCPServer.ico

     文件        405  2009-09-30 10:26  PiggyIOCPServer_2008\PiggyIOCPServer\res\PiggyIOCPServer.rc2

     文件        163  2009-10-06 23:46  PiggyIOCPServer_2008\PiggyIOCPServer\res\vssver2.scc

     文件        868  2009-09-30 10:41  PiggyIOCPServer_2008\PiggyIOCPServer\resource.h

     文件        146  2009-09-30 10:19  PiggyIOCPServer_2008\PiggyIOCPServer\stdafx.cpp

     文件       1772  2011-08-30 12:40  PiggyIOCPServer_2008\PiggyIOCPServer\stdafx.h

     文件       1030  2009-10-07 00:15  PiggyIOCPServer_2008\PiggyIOCPServer\targetver.h

     文件        594  2009-09-27 09:25  PiggyIOCPServer_2008\PiggyIOCPServer\XPstyle.manifest

     文件     138752  2011-08-30 12:40  PiggyStressTestClient.exe

     目录          0  2011-08-30 12:39  PiggyIOCPServer_2008\PiggyIOCPServer\res

     目录          0  2011-08-30 12:40  PiggyIOCPServer_2008\PiggyIOCPServer

     目录          0  2011-11-02 10:02  PiggyIOCPServer_2008

----------- ---------  ---------- -----  ----

               282317                    25


评论

共有 条评论