手机版

完成端口(IOCP)的实现(10)

发布时间:2021-06-06   来源:未知    
字号:

整理的一个简单的完成端口类

uf,0,MAX_BUF);
memset(&(pIo->ol),0,sizeof(WSAOVERLAPPED));
pIo->wsabuf.buf = pIo->buf;
pIo->wsabuf.len = MAX_BUF;
pIo->IoOperation = IO_READ;
ret = WSARecv(pHd->IoSocket,&(pIo->wsabuf),1,&dwRecv,&flag,&(pIo->ol),NULL);

if(SOCKET_ERROR == ret)
{
if(WSA_IO_PENDING != WSAGetLastError())
{
Disconnect(pHd->IoSocket);
InsertIoMem(pIo);
return;
}
}
}

//处理发送事件
void NetCompletionPort::SendEvent(LPPER_IO_CONTEXT pIo,LPPER_HANDLE_CONTEXT pHd,DWORD dwByte)
{
if(dwByte < 0)
{
InsertIoMem(pIo);
Disconnect(pHd->IoSocket);
}
else
{
InsertIoMem(pIo);
}
}

//处理接收事件
void NetCompletionPort::RecvEvent(LPPER_IO_CONTEXT pIo,LPPER_HANDLE_CONTEXT pHd,DWORD dwByte)
{
if(dwByte < 0)
{
InsertIoMem(pIo);
Disconnect(pHd->IoSocket);
}
else
{
RecvData(pIo->buf, GetClient(pHd->IoSocket));
DWORD flag = 0;
DWORD dwRecv = 0;
DWORD ret = 0;
memset(pIo->buf,0,MAX_BUF);
memset(&(pIo->ol),0,sizeof(WSAOVERLAPPED));
pIo->wsabuf.buf = pIo->buf;
pIo->wsabuf.len = MAX_BUF;
pIo->IoOperation = IO_READ;
ret = WSARecv(pHd->IoSocket,&(pIo->wsabuf),1,&dwRecv,&flag,&(pIo->ol),NULL);

if(SOCKET_ERROR == ret)
{
if(WSA_IO_PENDING != WSAGetLastError())
{
Disconnect(pHd->IoSocket);
InsertIoMem(pIo);
return;
}
}
}
}

//处理关闭事件
void NetCompletionPort::CloseEvent(LPPER_IO_CONTEXT pIo,LPPER_HANDLE_CONTEXT pHd)
{
Disconnect(pIo->sClient);
InsertIoMem(pIo);
}

//工作者线程函数
unsigned __stdcall NetCompletionPort::
(LPVOID param)
{
NetCompletionPort* p = (NetCompletionPort*)param;
HANDLE port = p->m_comPort;
DWORD dwByteSend;
DWORD dwByteRecv;
DWORD dwByteTrans;
bool flag;
DWORD ret;
BYTE opType;
LPPER_IO_CONTEXT pIoData = NULL;
LPPER_HANDLE_CONTEXT pHandleData = NULL;

while(p->m_isCreate)
{
pIoData = NULL;
pHandleData = NULL;
ret = GetQueuedCompletionStatus(port,&dwByteTrans,
(LPDWORD)&pHandleData,(LPOVERLAPPED*)&pIoData,1000);
if(FALSE == ret)
{
continue;
}
else if(pIoData == NULL)
{
return 0;
}
opType = pIoData->IoOperation;


if(opType != IO_ACCEPT && dwByteTrans == 0)
{
p->Disconnect(pHandleData->IoSocket);
p->InsertIoMem(pIoData);

完成端口(IOCP)的实现(10).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
×
二维码
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)