void CServiceDlg::NotifyReceivedPackage(CClientInfo *pClient, CIOCPBuffer *pOverlapBuf, int nSize)
{
SendPackage(pClient, "aaaaa", strlen("aaaaa"));
SendPackage(pClient, "bbbbb", strlen("bbbbb"));
SendPackage(pClient, "ccccc", strlen("ccccc"));
SendPackage(pClient, "ddddd", strlen("ddddd"));
}IOCP server源码是网上下的,急救,客户端只能接受一条啊!前辈有没碰到过啊!~救命!~

解决方案 »

  1.   


    BOOL CIOCPServer::SendPackage(CClientInfo *pClient, char* pSendBuf, int nSendLen)
    {
    CIOCPBuffer *pOverlapBuf = AllocateBuffer(IO_Write); if (pOverlapBuf != NULL) {
    if (pOverlapBuf->CreatePackage(pSendBuf, nSendLen)) {
    BOOL ret = AsynSend(pClient, pOverlapBuf);
    return ret;
    }
    else {
    ReleaseBuffer(pOverlapBuf);
    return FALSE;
    }
    }
    return FALSE;
    }BOOL CIOCPServer::AsynSend(CClientInfo *pClient, CIOCPBuffer *pOverlapBuf)
    {
    if (pOverlapBuf == NULL){
    ReleaseBuffer(pOverlapBuf);
    pOverlapBuf = NULL;
    return FALSE;
    } if ( pClient->m_Socket != INVALID_SOCKET ) {
    BOOL bSuccess = PostQueuedCompletionStatus(m_hCompletionPort, pOverlapBuf->GetUsed(), 
      (DWORD)pClient, &pOverlapBuf->m_OverLapped);
    if ((!bSuccess && GetLastError() != ERROR_IO_PENDING)) {
    ReleaseBuffer(pOverlapBuf);
    ToIdleClientList(pClient);
    return FALSE;

    return TRUE;
    }
    else {
    ReleaseBuffer(pOverlapBuf);
    ToIdleClientList(pClient);
    } return FALSE;
    }
      

  2.   


    CIOCPBuffer* CIOCPServer::AllocateBuffer(EnIOType nType)
    {
    CIOCPBuffer *pBuf = NULL; m_IdleBufferLock.Lock();
    if (!m_IdleBufferList.IsEmpty()) {
    pBuf = (CIOCPBuffer *)m_IdleBufferList.RemoveHead();
    }
    m_IdleBufferLock.Unlock(); if (pBuf == NULL) {
    pBuf = new CIOCPBuffer();
    if (!pBuf) {
    return NULL;
    }
    } if (pBuf != NULL) {
    pBuf->EmptyUsed();
    pBuf->SetOperation(nType); POSITION pos = NULL; m_UsedBufferLock.Lock();
    pos = m_UsedBufferList.AddHead(pBuf);
    if (pos != NULL) {
    pBuf->SetPosition(pos);
    }
    else {
    delete pBuf;
    m_UsedBufferLock.Unlock();
    return NULL;
    }
    m_UsedBufferLock.Unlock();
    } return pBuf;
    }
      

  3.   

    SendPacket 都有唯一buffer对应的!~ AllocateBuffer 代码在上面
      

  4.   


    BOOL CIOCPServer::SendPackage(CClientInfo *pClient, char* pSendBuf, int nSendLen)
    {
    ...//
       这里加个 Sleep(1000);会好点
    }
      

  5.   

    你将那个收到的唯一的包DUMP出来, 看看是否包含了其他包的信息?
      

  6.   

    不包含 ,大小 就是对应的 我发的包的大小!~搞死!~!wsasend 没错误,GetQueuedCompletionStatus有 997错误(可以pass),其他都正确!~
      

  7.   

    不知道 LZ 想用 IOCP 做什么样的功能?LZ可以去试试 spserver ,能够方便地实现类似 echo,chatroom 这类的应用。http://code.google.com/p/spserver/只需要编译 spserver 和 testiocpecho/testiocpchat 项目。
      

  8.   

    怎么禁止IOCP 自己 把多个包 组成一个包?急救!