如何用indy10 的UDP传输接收记录类型?

zhwei_wen 2006-09-29 10:31:11
type
tmymsg=record
name:string;
age:string;
end;


//发送

var msg:tmymsg;
begin
msg.name='a' ;
msg.age='10';

idudpsvr.sendto('XXX.XXX.XXX.XXX',3333,rawtobytes(msg,sizeof(msg));//发送成功
end;



//在接收端如何还原为记录类型呢?
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);
begin
// ????
end;
...全文
381 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzzlp 2007-03-21
  • 打赏
  • 举报
回复
indy10有些版本没有这个函数,实现是:

procedure BytesToRaw(const AValue: TIdBytes; var VBuffer; const ASize: Integer);
begin
Assert(Length(AValue) >= ASize);
Move(AValue[0], VBuffer, ASize);
end;
blueseaineye 2006-11-18
  • 打赏
  • 举报
回复
看到zhwei_wen(GoldStone)的结贴真的好遗憾,知道答案也不写出来,我来解释一下吧:

//消息体定义
type
TUser = record
Id: Integer;
Ip: String[30];
end;
//发送
procedure TForm1.Button1Click(Sender: TObject);
var
user: TUser;
begin
user.Id := 1000;
user.Ip := '192.168.1.8';
IdUDPClient1.SendBuffer('127.0.0.1', 8888, RawToBytes(user,sizeof(user)));
end;
//接收
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);
var
user: TUser;
begin
BytesToRaw(AData, user, SizeOf(TUser));
ShowMessage(IntToStr(user.Id) + ' ' + user.Ip);
end;
zhwei_wen 2006-10-03
  • 打赏
  • 举报
回复
谢谢诸位.自己解决了.

要使用INDY的涵数.
wayrt 2006-10-02
  • 打赏
  • 举报
回复
不好意思。错了。 Move(AData,msg);
wayrt 2006-10-02
  • 打赏
  • 举报
回复
Move(AData,tmymsg);
zhwei_wen 2006-10-02
  • 打赏
  • 举报
回复
谢谢楼上的几位。

我不知道如何去接收,看它的定义:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);

如何把TBYTES类型转为我定义的MSG记录类型呢?
zhangxuyu1118 2006-09-30
  • 打赏
  • 举报
回复
以下代码D6中测试通过
procedure TForm1.Button1Click(Sender: TObject);
var
msg:tmymsg;
begin
msg.name := 'zxy';
msg.age := '10000';
idudpsvr.SendBuffer('127.0.0.1',1024,msg,sizeof(msg));//发送成功
end;


procedure TForm1.idudpsvrUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
msg:tmymsg;
begin
AData.Read(msg,sizeof(msg));
showmessage(msg.name);
showmessage(msg.age);
end;
zhangxuyu1118 2006-09-30
  • 打赏
  • 举报
回复
type
tmymsg=record
name:string;
age:string;
end;
定义不对!
应该
type
tmymsg=record
name:string[250];
age:string[250];
end;
  • 打赏
  • 举报
回复
Delphi默认string是长串,本质是指针。
所以你那样发送会有问题。
这样定义:
type
tmymsg=record
name:string[31];
age:string[3];
end;

postren 2006-09-29
  • 打赏
  • 举报
回复
或用name: array [0..X] of Char;
Cassava 2006-09-29
  • 打赏
  • 举报
回复
参考http://www.delphibbs.com/delphibbs/dispq.asp?lid=3153454

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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