我现在做一个通讯程序,有一个CLIENT 有一个SERVER;CLIENT连接SERVER,如果CLIENT发送的包很快的话,会出现发送阻塞现象(错误码为10035)这时发现SERVER的ONRECEIVE事件不触发了,但我查询缓冲中还有8192个字节。试了很多次,CLIENT与SERVER的发送包与接受包对不上,不知怎么处理!请各位指教!

解决方案 »

  1.   

    你在Create时,没有加入相应的事件,当然不会触发.
    MSN:[email protected]
    MailTo:[email protected]
      

  2.   

    用CSocketFile和CArchive对象怎么样?
    另外在Server类中放个hWnd,
    在OnReceive触发的时候PostMessage(hWnd,WM_GGGG,0) ;
    然后,扑获这个消息:
    #define WM_GGGG WM_USER+100
    CXXXXXView::CView
    {
       /....
       protected:
          //slkdfjslkdj
            afx_msg void xxxx(xxx,xxx,xxx) ;
            ...
            afx_msg void ReceivedMsg(UINT msg,LParam,WPARAM) ;
          //sdklfjsldkf
    };
    void CXXXX::ReceivedMsg(UINT msg,....)
    {
         m_Msg.Serialize(*pClient->m_in) ; // 这样就可以了。
    }
    应该效果会好些。
      

  3.   

    你说:但我查询缓冲中还有8192个字节。试了很多次,是指server端的接收缓冲区吗?
      

  4.   

    1、也许是client端的send有问题,导致了server接收处理数据出现问题。void  ...Socket::OnSend(int nErrorCode) 
    {
    if(m_bNeedSend){
                      //m_SendArray 是要发的数据;m_cbSendOut是已发的字节数
    int nBytes=CAsyncSocket::Send(m_SendArray+m_cbSendOut,SEND_BYTES-m_cbSendOut);
    if(nBytes==SOCKET_ERROR )
    {
    if(GetLastError()!=WSAEWOULDBLOCK){
    //HandleClose();
    m_bNeedSend=false;
    }
    else
    AsyncSelect( FD_WRITE | FD_CLOSE );
    }else{
    m_cbSendOut+=nBytes;
    if(m_cbSendOut<SEND_BYTES){
    AsyncSelect( FD_WRITE | FD_CLOSE );
    }else{
    m_bNeedSend=false;
    AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE );
    }
    }
    } CAsyncSocket::OnSend(nErrorCode);
    }
    2、你自己在OnRecv中
    在Receieve(pBuf,BYTELEN);之后
    添加一行AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE );
    主要是FD_READ,这样如果你的接收缓冲区有数据,就应该再次调用OnRecv,
    而在OnRecv中,你判断接收缓冲区中有多少数据,用相应的长度调用Receieve(pBuf,BYTELEN);