采用完成端口测试 .客户端发送大约33259左右字节之后..服务对止客户端SOCKET出现阻塞现像
lpContext->m_WriteBuffer.Write(strData); printf("Waiting for WRITE event\n");
WaitForSingleObject(lpContext->m_hWriteComplete, INFINITE);
printf("WaitForSingleObject*************************************\n");
//准备发送数据
lpContext->m_wsaOutBuffer.buf = lpContext->m_WriteBuffer.GetBuffer();
lpContext->m_wsaOutBuffer.len = lpContext->m_WriteBuffer.GetBufferLen();

LPOVERLAPPEDPLUS lpOverlap = AllocateOverlappedPlus(OP_IOWrite);
PostQueuedCompletionStatus(m_hIocp, 0, (DWORD) lpContext, &lpOverlap->ol); 
屏幕打印完后
printf("Waiting for WRITE event\n");感觉好像挂起了...

解决方案 »

  1.   

    再加:
    ULONG ulFlags = MSG_PARTIAL; //删除已经发送了的数据
    lpContext->m_WriteBuffer.Delete(dwIoSize);
    if (lpContext->m_WriteBuffer.GetBufferLen()== 0)
    {
    //数据都发送了!
    //清除缓存
    lpContext->m_WriteBuffer.ClearBuffer();
    // 写事件完成了,可以允许下次写了
    SetEvent(lpContext->m_hWriteComplete); }
    else
    {
    LPOVERLAPPEDPLUS pOverlap = AllocateOverlappedPlus(OP_IOWrite); lpContext->m_wsaOutBuffer.buf = lpContext->m_WriteBuffer.GetBuffer();
    lpContext->m_wsaOutBuffer.len = lpContext->m_WriteBuffer.GetBufferLen(); int nRetVal = WSASend(lpContext->m_Socket,
    &lpContext->m_wsaOutBuffer,
    1,
    &lpContext->m_wsaOutBuffer.len,
    ulFlags,
    &pOverlap->ol,
    NULL);
    if (nRetVal == SOCKET_ERROR && WSAGetLastError()!= WSA_IO_PENDING)
    {
    FreeClientContext(lpContext);
    } }
      

  2.   

    投递一个Send请求 ..之后

    BOOL bResult = GetQueuedCompletionStatus(pIocpServer->m_hIocp,
    &dwNumRead,
    (LPDWORD)&lpContext,
    &lpOverlapped,
    INFINITE);
    之后
    再WSASend .真正的发送???
    是这样的机制吗.
    还是GetQueuedCompletionStatus( 得到的是发送完成之后的操作
      

  3.   

    GetQueuedCompletionStatus
    好像只是分配给你一个sock操作的机会吧...有没有人来啊
      

  4.   

    http://www.codeproject.com/internet/winsockiocp.asp ,看一下他的源代码