socket数据包头、包体如何定义?在用sendbuf传输之前需要如何转换类型? socket数据包头、包体如何定义?在用sendbuf传输之前需要如何转换类型?多谢!!!!!!!!!!!!!!!!!!!!!!!!!!!在线 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用sendbuf发送record的内容例如:TApple = record color:TColor; weight:Integer; end;var apple:TApple;begin apple.color := clRed; apple.weight:= 12; ClientSocket1.Socket.SendBuf(@apple,sizeof(TApple));end;接收可以用ClientSocket1.Socket.ReveiveBuf(@apple,sizeof(TApple)); 改 EmpMessage 结构 ,加上 GRECORDCOUNT :BYTE 一项EmpMessage=record ename:string[12]; phone:string[20]; address:string[100]; sendtime:string[30]; memberid:string[9]; orderid:string[13]; computerid:string[8]; MerkId:string[2]; cardid:string[2]; mem:string[255]; ReCount:integer; G_Record:array of GoodsRec,加上 GRECORDCOUNT :BYTE; //指定array of GoodsRec 的大小-----------------------------------发送时:procedure sendrecord;varsendem :EmpMessage;grecorcount:Byte;recordsize:integer;SendStream :tmemorystream;begin grecorcount:=3; Setlength(sendem.G_record,grecorcount); recordsize:=sizeof(EmpMessage) +grecorcount*sizeof(GoodsRec);//注意这里!! sendem.grecorcount:=grecorcount; sendem.ename:='test'; ......//填完其他的数据 sendem.G_record[0].goodsid:='aaaaaaaaaa'; sendem.G_record[0].goodsname:='bbbbbbbbb'; ...... sendem.G_record[grecorcount].goodsid:='fffffff'; sendem.G_record[grecorcount].goodsname:='zzzzzzzz'; SendStream:=Tmemorystream.create; try Sendstream.write(sendem,recordsize); Sendstream.position:=0; clientsocket.sendStream(sendstream);finally Sendstream.free;end;end; 接收端procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);type PEmpMessage=^EmpMessage;var EM:EmpMessage; buf:pchar; grecordcount:integer;begin getmem(buf,socket.ReceiveLength);try socket.ReceiveBuf(buf^,socket.ReceiveLength); EM:=PEmpMessage(buf)^; grecordcount:=em.grecordcount;////取出 G_record 数据 ///其他数据省略不写了 memo1.lines.add(inttostr(EM.G_Record[0].id)); memo1.lines.add(EM.G_Record[0].goodsid); memo1.lines.add(EM.G_Record[0].goodsname); ........finally freemem(buf);end; MdiChild子窗体中如何调用 Mdi主窗体中的 AdoConnection 有没有在编译时取编译时间的函数?编译后就替换成常量了.(用来作版本控制) 数据库的备份和恢复问题 有没有人用过TDrawGrid 么在给定的cell里draw颜色呢? 高手赐教:在Delphi中如何实现类似qq可上下移动的面板效果。 如何动态建查询字段,当建后,如何释放 窗体上有30多个Tedit控件,怎样用比较简洁的语句将它们同时置空? 这个矛盾如何解决? 工具栏图标显示的简单问题 to:chechy 分来了! 问问如何实现这一方案的思想? 四个比较简单的问题
例如:TApple = record
color:TColor;
weight:Integer;
end;
var
apple:TApple;
begin
apple.color := clRed;
apple.weight:= 12;
ClientSocket1.Socket.SendBuf(@apple,sizeof(TApple));
end;
接收可以用ClientSocket1.Socket.ReveiveBuf(@apple,sizeof(TApple));
ename:string[12];
phone:string[20];
address:string[100];
sendtime:string[30];
memberid:string[9];
orderid:string[13];
computerid:string[8];
MerkId:string[2];
cardid:string[2];
mem:string[255];
ReCount:integer;
G_Record:array of GoodsRec,
加上 GRECORDCOUNT :BYTE; //指定array of GoodsRec 的大小
-----------------------------------
发送时:
procedure sendrecord;
var
sendem :EmpMessage;
grecorcount:Byte;
recordsize:integer;
SendStream :tmemorystream;
begin
grecorcount:=3;
Setlength(sendem.G_record,grecorcount);
recordsize:=sizeof(EmpMessage) +grecorcount*sizeof(GoodsRec);//注意这里!!
sendem.grecorcount:=grecorcount;
sendem.ename:='test';
......//填完其他的数据
sendem.G_record[0].goodsid:='aaaaaaaaaa';
sendem.G_record[0].goodsname:='bbbbbbbbb';
......
sendem.G_record[grecorcount].goodsid:='fffffff';
sendem.G_record[grecorcount].goodsname:='zzzzzzzz'; SendStream:=Tmemorystream.create;
try
Sendstream.write(sendem,recordsize);
Sendstream.position:=0;
clientsocket.sendStream(sendstream);
finally
Sendstream.free;
end;
end; 接收端procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
type PEmpMessage=^EmpMessage;
var
EM:EmpMessage;
buf:pchar;
grecordcount:integer;
begin
getmem(buf,socket.ReceiveLength);
try
socket.ReceiveBuf(buf^,socket.ReceiveLength);
EM:=PEmpMessage(buf)^;
grecordcount:=em.grecordcount;////取出 G_record 数据 ///其他数据省略不写了
memo1.lines.add(inttostr(EM.G_Record[0].id));
memo1.lines.add(EM.G_Record[0].goodsid);
memo1.lines.add(EM.G_Record[0].goodsname);
........
finally
freemem(buf);
end;