初学CAsyncSocket遇到的问题,程序的信息发送太快怎么解决? 每发送一条后等待用户回应呀,类似于 ACK 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to:gameboy999(爱一个人到底有多难?!) 如何等待,请试举一例为盼!多谢 就是服务器发送一条消息以后,再收到客户端的Ready消息后再继续发送呀 for example:void AnalyzePacket(SOCKET skt,char * buf,int rval,CFile &file,FileList & filelist){ static int bTransFile = FALSE; //屏蔽掉非法包头,客户端最多一次只发1024字节 if( rval< sizeof(StdHeader) || rval > 1024 ) return; StdHeader * p = (StdHeader *) buf; //数据如果不符合校验,不予理睬 if ( p->Identifier != STANDARD_HEADER ) return; //包可能损坏,实际大小与所接受到的数据不一致 if ( p->nSize != rval ) return; //随时都可以处理的包 switch(p->lType) { case MSG_QUERY_UPDATE: { stMSG_QUERY_UPDATE * p = (stMSG_QUERY_UPDATE *) buf; //初始化filelist InitFileList(file,filelist,p->Version); //...分析版本号,并填充file数组 stMSG_ANSWER_UPDATE msg; msg.header.Identifier = STANDARD_HEADER; msg.header.lType = MSG_ANSWER_UPDATE; msg.header.nSize = sizeof(stMSG_ANSWER_UPDATE); msg.FileCount = filelist.FileCount; msg.FileTotalSize = filelist.TotalSize; send(skt,(char *)&msg,msg.header.nSize,0); } break; case MSG_READY: { //如果文件还没有结束 if(!filelist.bFileisOver) { stMSG_FILE_CONTENT msg; memset(&msg,0,sizeof(msg)); msg.header.Identifier = STANDARD_HEADER; msg.header.lType = MSG_FILE_CONTENT; msg.ClipSize = file.Read(msg.FileContent,1024 - sizeof(StdHeader) - sizeof(long)); msg.header.nSize = msg.ClipSize + sizeof(StdHeader) + sizeof(long); if(msg.ClipSize != 0) //文件还没发送完 { send(skt,(char *)&msg,msg.header.nSize,0); filelist.bFileisOver = FALSE; } else { StdHeader msg; msg.Identifier = STANDARD_HEADER; msg.lType = MSG_END_FILE; msg.nSize = sizeof(msg); send(skt,(char *)&msg,msg.nSize,0); file.Close(); filelist.bFileisOver = TRUE; } } else {//已发完一个文件,如果有就继续发 if(filelist.Curfile < filelist.FileCount) { stMSG_BEGIN_FILE msg; memcpy(&msg,&filelist.file[filelist.Curfile],sizeof(msg)); msg.header.Identifier = STANDARD_HEADER; msg.header.lType = MSG_BEGIN_FILE; msg.header.nSize = sizeof(msg); file.Open(filelist.file[filelist.Curfile].SourceName,CFile::typeBinary | CFile::modeRead | CFile::shareDenyNone ); msg.FileSize = filelist.file[filelist.Curfile].FileSize; send(skt,(char *)&msg,msg.header.nSize,0); filelist.bFileisOver = FALSE; filelist.Curfile++; } else { //发送升级结束信息 StdHeader msg; msg.Identifier = STANDARD_HEADER; msg.lType = MSG_END_UPDATE; msg.nSize = sizeof(msg); send(skt,(char *)&msg,msg.nSize,0); } } } break; } } 串口 求助啊:如何通过xsd文件,读取xml文件中的内容 调用dll模块中函数出现错误 CListrCtrl背景图不完整,怎么解决啊,急!~ 关于MainFrame和ChildFrame的问题 mugong:如何去掉最大化按钮? Release版编译时的警告信息 ●●谁知道 AfxGetApp() 到底是怎么回事?●● 如何判断ADO 的Recordset 是否已经打开? 如何用ADO操作多张表? 学VB已经有一段时间了,自以为VB已经入了门。 最近抄的很热的vc.net大家也不必很盲从
{
static int bTransFile = FALSE; //屏蔽掉非法包头,客户端最多一次只发1024字节
if( rval< sizeof(StdHeader) || rval > 1024 ) return; StdHeader * p = (StdHeader *) buf; //数据如果不符合校验,不予理睬
if ( p->Identifier != STANDARD_HEADER ) return; //包可能损坏,实际大小与所接受到的数据不一致
if ( p->nSize != rval ) return; //随时都可以处理的包
switch(p->lType)
{
case MSG_QUERY_UPDATE:
{
stMSG_QUERY_UPDATE * p = (stMSG_QUERY_UPDATE *) buf; //初始化filelist
InitFileList(file,filelist,p->Version); //...分析版本号,并填充file数组
stMSG_ANSWER_UPDATE msg;
msg.header.Identifier = STANDARD_HEADER;
msg.header.lType = MSG_ANSWER_UPDATE;
msg.header.nSize = sizeof(stMSG_ANSWER_UPDATE);
msg.FileCount = filelist.FileCount;
msg.FileTotalSize = filelist.TotalSize; send(skt,(char *)&msg,msg.header.nSize,0);
}
break; case MSG_READY:
{
//如果文件还没有结束
if(!filelist.bFileisOver)
{
stMSG_FILE_CONTENT msg;
memset(&msg,0,sizeof(msg));
msg.header.Identifier = STANDARD_HEADER;
msg.header.lType = MSG_FILE_CONTENT;
msg.ClipSize = file.Read(msg.FileContent,1024 - sizeof(StdHeader) - sizeof(long));
msg.header.nSize = msg.ClipSize + sizeof(StdHeader) + sizeof(long); if(msg.ClipSize != 0) //文件还没发送完
{
send(skt,(char *)&msg,msg.header.nSize,0);
filelist.bFileisOver = FALSE;
}
else
{
StdHeader msg;
msg.Identifier = STANDARD_HEADER;
msg.lType = MSG_END_FILE;
msg.nSize = sizeof(msg);
send(skt,(char *)&msg,msg.nSize,0);
file.Close(); filelist.bFileisOver = TRUE;
}
}
else
{//已发完一个文件,如果有就继续发
if(filelist.Curfile < filelist.FileCount)
{
stMSG_BEGIN_FILE msg;
memcpy(&msg,&filelist.file[filelist.Curfile],sizeof(msg));
msg.header.Identifier = STANDARD_HEADER;
msg.header.lType = MSG_BEGIN_FILE;
msg.header.nSize = sizeof(msg);
file.Open(filelist.file[filelist.Curfile].SourceName,CFile::typeBinary | CFile::modeRead | CFile::shareDenyNone );
msg.FileSize = filelist.file[filelist.Curfile].FileSize;
send(skt,(char *)&msg,msg.header.nSize,0); filelist.bFileisOver = FALSE;
filelist.Curfile++;
}
else
{
//发送升级结束信息
StdHeader msg;
msg.Identifier = STANDARD_HEADER;
msg.lType = MSG_END_UPDATE;
msg.nSize = sizeof(msg);
send(skt,(char *)&msg,msg.nSize,0);
}
}
}
break;
}
}