很适合回去好好研究!欢迎指正!!

风中的男子 2001-12-20 03:10:48
目的:
利用ServerSocket的ReciveBuf将接受到的自己消息定义
的保存在自己定义的消息列表中,保存了若干消息后开始处理,
一直到消息列表为空。

思路:
消息列表就是一个队列,FIFO处理方式,每次取头部Head作
为目前处理的消息,然后head后移,此时设置bool变量isover=F,
只有处理完毕才设置为T,才能取得新的head。endnode为最后的
结点,每次都把新消息插入到endnode后,因为消息的长短不同
,所以定义了一个足可以容纳所有消息长度的结构,在接受和取
消息时作buffer,因为所有的消息有共同的部分,可以根据共同
部分的内容来作出不同的处理。

发送消息方法:
两个BUTTON,BUTTON1发送消息A,BUTTON2发送消息B,可以重复
发送。

处理消息方法:
Button3Click() 开始处理消息。


//------------------------------------------
#ifndef Unit1bakH
#define Unit1bakH
//---------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
typedef struct tagMSGHEADER
{
AnsiString cmd;
}MSGHEADER;
//buffer below
typedef struct tagCMDLISTS
{
MSGHEADER msgheader;
char body[100];
tagCMDLISTS *next;
} CMD_LISTS;

typedef struct a //消息A
{
MSGHEADER msgheader;
int ia;
}s_a;

typedef struct b //消息B
{
MSGHEADER msgheader;
int ib;
char char_b;
}s_b;

bool isover;
CMD_LISTS *head,*cmdMsg,*newhead,*cmdList;
CMD_LISTS *curJob,*endnode;
//---------------------------------------------------------
class TForm1 : public TForm
{
__published:
TClientSocket *CS1;
TServerSocket *SS1;
TButton *Button1;
TEdit *Edit1;
TButton *Button2;
TButton *Button3;
void __fastcall FormCreate(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall SS1ClientRead(TObject *Sender,
TCustomWinSocket *Socket);
void __fastcall Button2Click(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
private:
public:
__fastcall TForm1(TComponent* Owner);
void __fastcall DoCurJob(CMD_LISTS*cmdMsg);
};
//------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//-----------------------------------------------------
#endif
*******************************************************
#include <vcl.h>
#pragma hdrstop
#include "Unit1bak.h"
//--------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
CS1->Host="127.0.0.1";
CS1->Port=8888;
SS1->Port=8888;
CS1->Active =true;
SS1->Active = true;
isover=true;
head=new CMD_LISTS;
head->msgheader.cmd=""; //表示消息队列为空
head->next=NULL;

cmdList=new CMD_LISTS;
cmdMsg=new CMD_LISTS;
endnode =new CMD_LISTS;
}
//-------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
s_a *a=new s_a;
a->msgheader.cmd="a";
a->ia=10;
CS1->Socket->SendBuf(a,sizeof(s_a));
}
//-------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
s_b *b=new s_b;
b->msgheader.cmd="b";
b->ib=20;
b->char_b ='b';
CS1->Socket->SendBuf(b,sizeof(s_b));
}
//--------------------------------------------------
void __fastcall TForm1::SS1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Socket->ReceiveBuf(cmdList,sizeof(CMD_LISTS));
//加入到消息队列中去
if(head->msgheader.cmd=="") //消息队列为空
{
//根据消息的不同保存不同的部分
if(cmdList->msgheader.cmd=="a")
{
s_a *tempD=new s_a ; //head;
s_a *tempS=(s_a*)cmdList;

tempD->msgheader.cmd="a";
tempD->ia=tempS->ia;

head=(CMD_LISTS*)tempD;
endnode=head;
endnode->next=NULL; //最后节点即为头节点
ShowMessage(++count);
}

if(cmdList->msgheader.cmd=="b")
{ ShowMessage("s_b as head");
s_b *tempD=new s_b;// head;
s_b *tempS=(s_b*)cmdList;

tempD->msgheader.cmd="b";
tempD->ib=tempS->ib;
tempD->char_b=tempS->char_b;

head=(CMD_LISTS*)tempD;
endnode=head;
endnode->next=NULL; //最后节点为头节点
ShowMessage(++count);
}
}
else //放在最后
{
if(cmdList->msgheader.cmd=="a")
{
s_a *tempS=(s_a*)cmdList;
s_a *tempD=new s_a;

tempD->msgheader.cmd="a";
tempD->ia=tempS->ia;

CMD_LISTS*temp=(CMD_LISTS*)tempD;
endnode->next=temp;
endnode=temp; //放在最后
endnode->next=NULL;
}

if(cmdList->msgheader.cmd=="b")
{
s_b *tempS=(s_b*)cmdList;
s_b *tempD=new s_b;

tempD->msgheader.cmd="b";
tempD->ib=tempS->ib;
tempD->char_b=tempS->char_b;

endnode->next=(CMD_LISTS*)tempD; //放在最后
endnode=(CMD_LISTS*)tempD; //endnode向后移动
endnode->next=NULL;
}

//....... if() //处理其它的消息方法类似

}
//保存消息完毕

}
// --------------------------------------------------
void __fastcall TForm1::DoCurJob(CMD_LISTS* cmdMsg)
{

//开始处理 cmdMsg
if(cmdMsg->msgheader.cmd=="a")
{
s_a *sa=(s_a*)cmdMsg;
ShowMessage(AnsiString(sa->ia));
isover=true;
}

if(cmdMsg->msgheader.cmd=="b")
{
s_b *sb=(s_b*)cmdMsg;
ShowMessage(AnsiString(sb->ib)+"\n"+AnsiString(sb->char_b ));
isover=true;
}
}
//----------------------------------------------------


void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete head;
delete cmdList;
delete cmdMsg;
delete endnode;
}
//--------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{ //消息队列不空且当前消息处理完成
while ((head->msgheader.cmd!="")&&(isover))
{
cmdMsg=head; //得到最早的消息
isover=false;
DoCurJob(cmdMsg); //处理消息

//开始设置新的头部
if(head->msgheader.cmd!="") //还有消息
{
head=head->next;
}
else //消息队列为空了,新的消息将作为头部
{
head->msgheader.cmd="";
head->next=NULL;
}
//设置新的头部完毕
} //end while

}
//--------------------------------------------------
上面的代码,可以运行,但是结果不好,经常访问冲突?
我认为是对队列的处理不好,象head和endnode,经常移动,
也不知道什么时候该delete.
...全文
52 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
still_me 2001-12-20
  • 打赏
  • 举报
回复
我看一看!
gxgxfish0813 2001-12-20
  • 打赏
  • 举报
回复
好。我看看

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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