首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于TIdUdpServer控件发送指定消息结构有关问题

2012-02-21 
关于TIdUdpServer控件发送指定消息结构问题有这么一个结构TMsgPac packed recordMsgHead:string[3]CMD

关于TIdUdpServer控件发送指定消息结构问题
有这么一个结构
TMsgPac = packed record
  MsgHead:string[3];
  CMD : Integer;
  end;

发送消息:var msg:TMsgPac; 
  msg.MsgHead:='ETE';
  msg.CMD:=2;
  msg.MSG:='msgmsgmsg';
  udps.SendBuffer('127.0.0.1',5678,msg,SizeOf(msg));

接受消息:[m是一个memo控件]
procedure TForm1.udpUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var msg:TMsgPac; s:string;
begin
  AData.Seek(0,0);
  AData.Read(msg,AData.Size);
  if msg.MsgHead='ETE' then
  m.Text:='['+inttostr(msg.CMD)+']'+'====================================='+#13#10+m.Text;
end;

一切正常。

但现在问题是,希望数据包的结构体是这样的:
TMsgPac = packed record
  MsgHead:string[3];
  CMD : Integer;
  msg:string;
  end;
而这个msg:string是不定长的。
可能是空串也可能是长度几千的字符串
用上面的方式 发送没问题。
可接收消息显示出来就遇到问题了。
该如何解决呢?

请指教,谢谢!

[解决办法]
需要修改TMsgPac ,增加一个字段,标识string的长度
[解决办法]
给你发个资料,老赵同志博客里的一篇讲发送记录型数据的文章

先将记录转换成TBytes, 
使用RawToBytes及BytesToRaw函数。这两个函数包含在IdGlobal单元中。 
另外,在接收或发送的时候用到TIdContext类,这个类包含在IdConText单元中。

Indy10记录及其他类型的传送 
http://www.cnblogs.com/laozhao/articles/indy10-tcpip.html
[解决办法]
定义一个string(5000)让你感觉不舒服的话,建议两步发,第一步发
MsgHead:string[3];
CMD : Integer;
msgLen:integer;

第二步,把Msg用流(TStream)的方式发,流的话你不用管长度了,indy会自己处理;

还有就是楼上提到的了,用id发record类型的数据,要使用RawToBytes及BytesToRaw函数转化一下。

[解决办法]
占个位置,学习学习.......

热点排行