VC++ 完成端口客户端I/O复用功能问题:
void CIOCPServer::CurrentBindListen(CIOCPContext *pClient)
{
// 为新接受的连接申请客户上下文对象
CIOCPBuffer *pBuffer = AllocateBuffer(BUFFER_SIZE);
//CIOCPContext *pClient = AllocateContext(m_sListen);
if(pClient != NULL)
{
if(AddAConnection(pClient))
{
// 取得客户地址
int nLocalLen, nRmoteLen;
LPSOCKADDR pLocalAddr, pRemoteAddr;
m_lpfnGetAcceptExSockaddrs(
pBuffer->buff,
pBuffer->nLen - ((sizeof(sockaddr_in) + 16) * 2),
sizeof(sockaddr_in) + 16,
sizeof(sockaddr_in) + 16,
(SOCKADDR **)&pLocalAddr,
&nLocalLen,
(SOCKADDR **)&pRemoteAddr,
&nRmoteLen);
memcpy(&pClient->addrLocal, pLocalAddr, nLocalLen);
memcpy(&pClient->addrRemote, pRemoteAddr, nRmoteLen);
// 关联新连接到完成端口对象
::CreateIoCompletionPort((HANDLE)pClient->s, m_hCompletion, (DWORD)pClient, 0);
// 向新连接投递几个Read请求,这些空间在套节字关闭或出错时释放
for(int i=0; i< 10; i++) //这里出现问题就是定义了10个,但是不能重复使用,用完了程序就卡壳(郁闷)
{
CIOCPBuffer *p = AllocateBuffer(BUFFER_SIZE);
if(p != NULL)
{
if(!PostRecv(pClient, p))
{
CloseAConnection(pClient);
break;
}
}
}
}
else // 连接数量已满,关闭连接
{
CloseAConnection(pClient);
ReleaseContext(pClient);
}
}
else
{
// 资源不足,关闭与客户的连接即可
::closesocket(m_sListen);
pBuffer->sClient = INVALID_SOCKET;
}
出现文件就是
}