初学CAsyncSocket遇到的问题,程序的信息发送太快怎么解决?

OnDraw 2002-03-15 10:19:36

我的CAsyncSocket程序在一个循环里给用户发送的两条信息,在客户端收到的是两条信息合并成的一条信息,如何让用户收到一条信息后再发第二条信息?
...全文
33 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
OnDraw 2002-03-17
  • 打赏
  • 举报
回复
多谢了
gameboy999 2002-03-15
  • 打赏
  • 举报
回复
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;
}

}
gameboy999 2002-03-15
  • 打赏
  • 举报
回复
就是服务器发送一条消息以后,再收到客户端的Ready消息后再继续发送呀
OnDraw 2002-03-15
  • 打赏
  • 举报
回复
to:gameboy999(爱一个人到底有多难?!)

如何等待,请试举一例为盼!多谢
cppnet 2002-03-15
  • 打赏
  • 举报
回复
continue..
OnDraw 2002-03-15
  • 打赏
  • 举报
回复
楼上两位仁兄能具体的讲一讲吗?多谢
neccui 2002-03-15
  • 打赏
  • 举报
回复
是啊,是啊。
或者用定长消息,就收那么长,也可以。
gameboy999 2002-03-15
  • 打赏
  • 举报
回复
每发送一条后等待用户回应呀,类似于 ACK

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧