完成是这样处理的啊,
if (WSARecv  == SOCKET_ERROR)
{
WSAGetLastError返回是值是WSA_IO_PENDING说明你的WSARecv投递是成功的。投递了一次WSARecv有数据就进入数据回调。
}

解决方案 »

  1.   

    现在的问题是可以接收到数据,但是每次都一有数据进来,就执行回调函数,wsaRecvBuf中却显示没有值
      

  2.   

    wsaRecv仅仅是你投递接操作,告诉系统你做了一次这样的操作,成功不成功是你在返回值可以判断的,接收数据是在你的完成回调过程里面接收告诉你多少数据接收完成在这个过程中处理完接收数据的处理后可以再做wsarecv的投递操作。
      

  3.   

    在回调过程中,做了对接收数据的处理,可以忽略不计,在最后重新调用了RecvData函数
      

  4.   

    贴完整代码, 关于回调的重叠io似乎只有windows网络编程 第八章有源码,其他都没有什么例子
      

  5.   

    // 接收数据
    bool CXXXX::RecvData(void)
    {
    DWORD dwBytesRecved;  //接收字节数
    DWORD dwFlags = 0;  //接收标志 ZeroMemory(&m_iReadIO, sizeof(WSAOVERLAPPED)); //重叠结构置0
    m_iReadIO.hEvent = WSAEVENT(this);


    char recvBuf[MAX_BUF_SIZE];
    ZeroMemory(recvBuf, MAX_BUF_SIZE);
    wsaRecvBuf.len = MAX_BUF_SIZE;
    // wsaRecvBuf.__byte_writableTo(MAX_BUF_SIZE) = recvBuf;
    wsaRecvBuf.buf = recvBuf;

    //异步接收数据
    if (SOCKET_ERROR == WSARecv(m_sockAccpet, &wsaRecvBuf, 1, &dwBytesRecved, &dwFlags, &m_iReadIO, IReadRoutine))
    {
    if (WSAGetLastError() != WSA_IO_PENDING)
    {
    closesocket(m_sockAccpet);
    return false;
    //continue;
    }
    }
    return true;
    }
    void CALLBACK CXXXX::IReadRoutine(DWORD dwError, DWORD dwTransferred, LPWSAOVERLAPPED lpOverlapped , DWORD dwFlags)
    {
    CClientFromShip *pClient = NULL;
    pClient = (CClientFromShip*)lpOverlapped->hEvent; //客户端指针
    if (dwError != 0 || dwTransferred == 0)  //错误处理
    {
    pClient->m_bDead = true;
    return;
    }
    pClient->HandleData();}void CXXXX::HandleData(void)
    {
    RecvData();
    }
    基本就是参考Windows网络编程的代码,只是没有用包头和包体的方式,想直接从WSABUF中读取数据
      

  6.   

      m_iReadIO.hEvent = WSAEVENT(this);
    pClient = (CClientFromShip*)lpOverlapped->hEvent; //客户端指针
    可否贴:WSAEVENT这个类还有: pClient 
      

  7.   


    您好,
    由于您长时间不结贴,上一次答复已超一个月并且已有最佳答案,本人帮你结贴。
    若是觉得答案不嘉,请放在本版的疑难杂症帖链接:
    http://bbs.csdn.net/topics/390351579。
    如果您有什么意见,请您联系我。
      

  8.   

    急急急,直接调WSARecv,返回-1,先调recv,然后调WSARecv就成功了,为什么?