本帖最后由 oyljerry 于 2014-10-24 16:56:22 编辑

解决方案 »

  1.   

    首先,WSASend成功了没有?其次,CreateIoCompletionPort不返回很正常,就算网络出错,也要等一段时间才会返回。最后,看看你的防火墙设置。
      

  2.   

    你的程序整个执行过程中
    CreateIoCompletionPort至少要执行两次
    第一次创建一个iocp
    第二次将socket绑定到这个iocp上
    绑定成功以后get才能获取到wsasend的回调事件
      

  3.   

    谁知道你的封装的IOCP类里怎么写的http://blog.csdn.net/VisualEleven/archive/2010/11/29/6041893.aspx
      

  4.   

    int len = WSASend(sockSvr,&wsaBuf,wsaBuf.len,NULL,WSA_FLAG_OVERLAPPED,(OVERLAPPED*)&olp,NULL);
      

  5.   

    一个socket与完成端口绑定,然后即调用了 WSARecv 又调用了 WSASend 
    那么WSASend的参数怎么绑定给GetQueuedCompletionStatus ?
    WSARecv 绑定时是用了CreateIoCompletionPort((HANDLE)hSocket, m_hIOCP, (ULONG_PTR)pIoRecvContent, 0) 第三个参数绑定了iocontent ,
    send代码如下,这个代码是没有问题的GetQueuedCompletionStatus 能收到它的iocontent ,
    可是我没看见绑定iocontent 的语句啊,谁能回答一下?
    try
    {
    DWORD sendlen=0;
    for( DWORD _start=0; _start<buflen; _start+=sendlen )
    {
    if( buflen-_start < SENDBUFLEN )  sendlen = buflen-_start;
    else  sendlen = SENDBUFLEN; DWORD i, ok_count;
    IOCONTENT * iocontent;
    SENDBUF * sendbuf;
    DWORD numbytes; sendbuf=AllocSendBuf();
    if(NULL==sendbuf) return 0; memcpy(sendbuf->buf, buf+_start, sendlen);
    sendbuf->count = (LONG)(count+1); for(i=0, ok_count=0; i<count; i++)
    {
    iocontent = AllocIOContent(); if(iocontent)
    {
    ZeroMemory(&iocontent->overlapped, sizeof(iocontent->overlapped)); if( bcolse && i >= count -1 )
    iocontent->state = eIoBeconSendClose;
    else
    iocontent->state = eIoBeconSend; iocontent->sendbuf = sendbuf;
    iocontent->wsabuf.buf = (char *)sendbuf->buf;
    iocontent->wsabuf.len = sendlen; numbytes = 0; iocontent->sock = socks[i];
    if( (WSASend(socks[i], &iocontent->wsabuf, 1, &numbytes, 0, &iocontent->overlapped, NULL)!=SOCKET_ERROR)
    ||(ERROR_IO_PENDING==WSAGetLastError()) )
    {
    ok_count++; m_sendBufLenArray.Lock();
    int sockind = m_sendBufLenArray.FindNode(socks[i]);
    if(-1==sockind) 
    {
    sockind = m_sendBufLenArray.NewNode(socks[i],TRUE);
    *(m_sendBufLenArray[sockind]) = 0;
    }
    if(-1!=sockind)
    {
    (*m_sendBufLenArray[sockind]) ++;
    }
    m_sendBufLenArray.Unlock(); continue;
    } FreeIOContent(iocontent);
    }
    InterlockedDecrement(&sendbuf->count);
    } if(InterlockedDecrement(&sendbuf->count)==0)
    {
    FreeSendBuf(sendbuf);
    }
    }
    //关闭
    if( bcolse )
    {
    for ( DWORD i = 0; i <count; i++)
    {
    linger m_sLinger;
    m_sLinger.l_onoff=1;
    m_sLinger.l_linger=5;
    setsockopt(socks[i],SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger)); closesocket(socks[i]);
    }
    } return 1;//ok_count;
    }
    catch(...)
    {
    return 0;
    }
    return 0;
      

  6.   

    而且,就算绑定,因为是同一个socket 那么,怎么区别???
      

  7.   

    估计完成端口绑定的不对吧,导致WSARecv的重叠I/O操作没有提交到完成端口。