enum Event_Type
{
WSA_UnKnow,
WSA_Accpte,
WSA_Recv,
WSA_Send
};
//这个是我定义的一个结构体,保存GetQueuedCompletionStatus后会返回的一些类型,
采用AcceptEX的方式一下子投递多个IO请求,使用测试客户端是会出现如下问题;
客户端连接时,返回正常WSA_Accpte;
客户端连接后,Send数据到服务端,GetQueuedCompletionStatus还是还回WSA_Accpte类型;
这就蛋疼了;
新手,对完成端口和网络方面的东东不甚了解,求大侠解惑;
如果需要具体的测试代码,请留言;
解决方案 »
- 关于GetWindowRgn和SetWindowRgn的疑问
- ISequentialStream的write方法
- 下面代码 看了4个通宵(看到早上5点)还是不怎么明白!真心求你看下这几个问题
- 问下了解的人,GDI+BMP的编码器有没有能将索引色进行RLE压缩的选项啊?
- 如何获取单个程序进程所占用的内存空间大小
- 网络编程有学哪些知识呢?
- 请教MFC中视口和窗口的区别
- 这些代码错在哪?AddFontResource("d:\\myfont.ttf"); SendMessage(WND_BROADCAST,0,0); //应该是:SendMessage(HWM_FONTCHANGE, WND_B
- c++就是VC吗
- 如何取得Excel单元表格宽度与其文字宽度之间的关系?
- QQ2012自动回复功能
- pjsua 的纠结……
这就蛋疼了;
--------------
你自己在PER_IO_DTATA结构体中有修改标记吗?你不会一直都没有修改吧
//感觉关键的地方就在这里了;投递肯定出了问题;
SOCK_DATA 这个是单句柄
IO_DATA 这个是单IOvoid CIOCPServer::OnAccept(IO_DATA * pIOContext,SOCK_DATA *pSockContext)
{
//获取地址信息
//GetAcceptExSockaddrs()....
//将接收到的Socket与完成端口绑定
SOCK_DATA * pSockIO = new SOCK_DATA();
pSockIO->m_Socket = pIOContext->m_AcceptSock;
HANDLE hIOPort = CreateIoCompletionPort((HANDLE)pSockIO->m_Socket,m_hCompletionPort,(ULONG_PTR)pSockIO,0);
//在接收到客户端连接后投递一个WSARecv请求
IO_DATA * pIOData = new IO_DATA();
pIOData->EvenType = WSA_Recv;
pIOData->m_AcceptSock = pIOContext->m_AcceptSock;
PostRecv(pIOData);//投递WsaRecv ....函数内容在下面 //将GetQueuedCompletionStatus返回的IO_DATA缓冲区置空,并投递AcceptEx请求
ZeroMemory(pIOContext->sBuffer,BUFFERSIZE);
PostAccept(pIOData);//投递WsaAccepte ,...函数内容在下面
}
bool CIOCPServer::PostAccept(IO_DATA* pIOData)
{
memset(&pIOData->m_overLapped,0,sizeof(pIOData->m_overLapped));
pIOData->EvenType= WSA_Accpte;
pIOData->m_AcceptSock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED); DWORD dwByte;
bool bRet = AcceptEx(m_sListenSock,pIOData->m_AcceptSock,pIOData->sBuffer,BUFFERSIZE-((sizeof(SOCKADDR_IN)+16)*2),
sizeof(sockaddr_in)+16,sizeof(sockaddr_in)+16,&dwByte,&pIOData->m_overLapped);
if(!bRet)
{
if(WSAGetLastError() != WSA_IO_PENDING)
{
return false;
}
}
return true;
}bool CIOCPServer::PostRecv(IO_DATA * pIOContex)
{ DWORD dwRecvBytes = 0;
DWORD dwFlag = 0;
WSABUF wsaBuf;
pIOContex->EvenType = WSA_Recv;
ZeroMemory(pIOContex->sBuffer,BUFFERSIZE);
wsaBuf.buf = pIOContex->sBuffer;
wsaBuf.len = BUFFERSIZE;
int nBytesRecv = WSARecv(pIOContex->m_AcceptSock,&wsaBuf,1,&dwRecvBytes,&dwFlag,&pIOContex->m_overLapped,0); // 如果返回值错误,并且错误的代码并非是Pending的话,那就说明这个重叠请求失败了
if ((SOCKET_ERROR == nBytesRecv) && (WSA_IO_PENDING != WSAGetLastError()))
{
return false;
}
return true;
}
<?php
echo "hello csdn,please Don't abandon me"
?>