我用完成端口写了一个文件传送的程序
传送文件时,每次传送一个结构(功能码+长度+信息),现在问题出现了:
假如一个 “功能码+长度+信息“数据包的长度是4000,在接收过程中有可能一次接受4000或更大 。
当大于4000时,我做如下处理:先取包里的4000,转换成自定义结构,然后再对剩下的转换为自定义结构.发现有以下问题:客户端每次发送的包大小固定,如果以上方式处理,后来接收到的包很可能为上次剩下部分的数据.
这种情况我该如何处理???
传送文件时,每次传送一个结构(功能码+长度+信息),现在问题出现了:
假如一个 “功能码+长度+信息“数据包的长度是4000,在接收过程中有可能一次接受4000或更大 。
当大于4000时,我做如下处理:先取包里的4000,转换成自定义结构,然后再对剩下的转换为自定义结构.发现有以下问题:客户端每次发送的包大小固定,如果以上方式处理,后来接收到的包很可能为上次剩下部分的数据.
这种情况我该如何处理???
解决方案 »
- CPen中PS_DASH的设置
- SendMessage(..............)这句话什么意思?
- 用c++模拟MFC的封装,但是运行没有消息响应!帮忙啊!
- 如果斑竹非要删我的贴,能不能不扣我的信誉值呀?多谢啊!
- 调查:现在用VC.net的多吗?
- 向父窗口中输出信息
- 怎样去掉tab控件上方的按钮
- 请问高手,如何突破不该有的网络障碍????我要上网!!!!!我要交流!!!!
- 可以不通过读表得到数据库中一个表已经增加了一条新记录么?
- tab键的ascii码是多少啊?我在msdn上怎么就是看不到tab键啊
- 如何实时移动位图
- Visual Studio 6.0, MSDN 2003, 安装在一起有问题。
你的包要加上头尾标志,同时需要校验,一般用CRC校验比较好
{
SaveMsg("Read %d bytes",read);
m_dataClient[nIDClient].m_llRecvedBytes+=LONGLONG(read);
int nPos=0;
m_dataClient[nIDClient].m_nGetSize+=read;
while(m_dataClient[nIDClient].m_nGetSize>0){
DWORD* pdwMsg = reinterpret_cast<DWORD*>(m_dataClient[nIDClient].m_bufRecv+nPos);
m_dataClient[nIDClient].m_nMsgId = pdwMsg[0];
m_dataClient[nIDClient].m_dwMsgSize = pdwMsg[1];
SaveMsg("Recieve message:%d,message size:%d(m_dataClient[nIDClient].m_nGetSize=%d)",m_dataClient[nIDClient].m_nMsgId,m_dataClient[nIDClient].m_dwMsgSize,m_dataClient[nIDClient].m_nGetSize);
if(m_dataClient[nIDClient].m_dwMsgSize+2*sizeof(DWORD)<=m_dataClient[nIDClient].m_nGetSize)
{
if(m_dataClient[nIDClient].m_nMsgId==Msg_Keep_Alive){
}else if(m_dataClient[nIDClient].m_nMsgId==Msg_Is_Alive){
}else if(m_dataClient[nIDClient].m_nMsgId>0 && NULL!=m_pLCom && m_pLCom->m_bCanReceive){ m_pLCom->OnReceive(m_dataClient[nIDClient].m_nMsgId,m_dataClient[nIDClient].m_bufRecv+(nPos+2*sizeof(DWORD)),m_dataClient[nIDClient].m_dwMsgSize,nIDClient);
}
m_dataClient[nIDClient].m_nPtr = 0;
}
else
{
//MoveMemory
m_dataClient[nIDClient].m_nPtr = m_dataClient[nIDClient].m_nGetSize;
if(nPos&&m_dataClient[nIDClient].m_nGetSize)
{
LDataBuf buffer;
buffer.GetBuf(m_dataClient[nIDClient].m_nGetSize);
CopyMemory(buffer.GetData(),m_dataClient[nIDClient].m_bufRecv+nPos,m_dataClient[nIDClient].m_nGetSize);
CopyMemory(m_dataClient[nIDClient].m_bufRecv,buffer.GetData(),m_dataClient[nIDClient].m_nGetSize);
}
break;
}
m_dataClient[nIDClient].m_nGetSize-=(2*sizeof(DWORD)+m_dataClient[nIDClient].m_dwMsgSize);
nPos+=(2*sizeof(DWORD)+m_dataClient[nIDClient].m_dwMsgSize);
}
InterlockedExchange(&m_dataClient[nIDClient].m_bReading,FALSE);
}
有的话还麻烦发给我
email:[email protected]
谢谢了