我的程序是单文档mfc程序,用来远程采集数据的,m_DataCheck是用来区分数据内容的
m_ADSetting是记录硬件设置的,m_pPhyData是采集到的数据
由于数据格式种类较多,所以我的方法是每次发送数据或者参数前先发送m_DataCheck用于标志
发送的内容,在用于发送数据的socket类里重载OnReceive函数如下
void CClientSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
m_pDoc->ProcessPendingReceive(this);
}
ProcessPendingReceive的内容如下:
void CSampleDoc::ProcessPendingReceive(CClientSocket* psocket)
{

do 
{
m_DataCheck.Serialize(*psocket->m_dataIn);
if (m_DataCheck.m_uDataCheck==0) 
{

m_pLogData.Serialize(*psocket->m_dataIn);
psocket->m_dataIn->Flush();
/*AfxMessageBox("receive log data");*/
/*TRACE("RECEIVE LOG DATA");*/
}
if(m_DataCheck.m_uDataCheck==3)
{
           
   m_ADSetting.Serialize(*psocket->m_dataIn);
   AfxMessageBox("receive adsetting");
}
if (m_DataCheck.m_uDataCheck==2) 
{
if (m_DataCheck.m_Action==0) 
{
psocket->m_bBeginSample=true;
TRACE("client starts to sample");
}
}
if(m_DataCheck.m_uDataCheck==1)
{

m_pPhyData.Serialize(*psocket->m_dataIn);
//TRACE("receive sample data");
TRACE("receive sample data");
}

} while(!psocket->m_dataIn->IsBufferEmpty());
}
请问我这段程序有问题吗
当我发送一次数据时,每次都是先发m_DataCheck,再发m_pPhyData,那么OnReceive是响应一次将两个都收到还是响应两次呢?
CSocket与CSOCKETFILE和CARCHIVE联用以后,一次发送的内容可以大于缓冲区吗?
我想知道用这种方式发送和接收数据时,OnReceive函数响应的是一次Serialize过程还是一个数据包到达缓冲区?
问题很多,请大家耐心解答,非常感谢

解决方案 »

  1.   

    //当我发送一次数据时,每次都是先发m_DataCheck,再发m_pPhyData,那么OnReceive是响应一次将两个都收到还是响应两次呢?
    这要看你是不是在Flush之前将m_DataCheck和m_pPhyData都送至发送缓冲区了。
    //CSocket与CSOCKETFILE和CARCHIVE联用以后,一次发送的内容可以大于缓冲区吗?
    当然不行,会导致缓冲区溢出。
    //我想知道用这种方式发送和接收数据时,OnReceive函数响应的是一次Serialize过程还是一个数据包到达缓冲区?
    响应的是你将发送缓冲区中数据Flush后的数据包(为了使收发对应,你应该在将数据Serialize到发送区后,立即Flush,这样响应的便是一次Serialize过程)