每发送一条后等待用户回应呀,类似于 ACK

解决方案 »

  1.   

    to:gameboy999(爱一个人到底有多难?!)    如何等待,请试举一例为盼!多谢
      

  2.   

    就是服务器发送一条消息以后,再收到客户端的Ready消息后再继续发送呀
      

  3.   

    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;
    }

    }