高分求解!

zhang_ff 2000-06-06 09:52:00
我正在使用UDP Socket同另一台专用设备通信。按规定我首先向它发送一个请求Message。这个Message的格式和长度一定。其长度为46字节。
顺次内容为:
Message_Type为0,2字节;
Client_Applic_Name为‘HIL_LAN_LINK’,ASCII格式,尾加0,16字节;
LInkNumber为1,2字节;
Serial_Number为0xFFFFFFFF(或8000),4字节;
Server_APplic_Name为‘HIL_SERVER‘,ASCII格式,尾加0,16字节;
Server_Instance为0,2字节;
SessionType为0,2字节;
Timeout为10,2字节。

现在让我困惑的是,这些数据的结构分别为:word,dword,string;如何能把它们组织到一起,通过TNMUDP的Method:
procedure SendBuffer(Buff: array of char; length: integer);
和procedure SendStream(DataStream: TStream);发送出去。
如果用record结构的话,如何使用上述Method?
如果不这样的话,还有什么好方法,希望不吝赐教。
...全文
231 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxy 2000-06-08
  • 打赏
  • 举报
回复
道理一样呀,和发送是反向的.
Udp.ReadStream(TempStream);
TempStream.Position := 0;
if TempStream.Size <> sizeOf(TMyRec) then
// something wrong here.deal with it.
TempStream.Read(Myrec,TempStream.size);
//然后就可以使用MyRec.Client_Applic_Name
zhang_ff 2000-06-08
  • 打赏
  • 举报
回复
致kxy:
非常感谢你的指点,我知道我的问题出在何处了,一点小失误。对你的帮助除了致以十二分的感激之外,奉上所有分数以示谢意!(抱歉!分数本应上上次就该给的。)
jackaroo 2000-06-07
  • 打赏
  • 举报
回复
致kxy:
type
TMyRec=record
Message_type:word;
Client_Applic_Name:array [0..15] of char;
Link_Number:word;
Serial_Number:dword;
Server_Applic_Name:array [0..15] of char;
Server_Applic_Instance:word;
Session_type:word;
Inactivity_timeout:word;
end;

var
QMeg:TMyRec;

begin

with QMeg do
begin
Message_type:=0;
Client_Applic_Name:='HIL_LAN_LINK';
Link_Number:=1;
Serial_Number:=8000;
Server_Applic_Name:='HIL_SERVER';
Server_applic_instance:=0;
Session_type:=0;
Inactivity_timeout:=10;
end;
end;
kxy 2000-06-07
  • 打赏
  • 举报
回复
写出你的结构我看看
zhang_ff 2000-06-07
  • 打赏
  • 举报
回复
致kxy:
感谢指点,但是当使用该方法时,却发现sizeof(TMyRec)=48,比我所需的固定长46字节多出2字节,这是怎么回事,如何解决或避免这个问题,望赐教,谢谢!
zhang_ff 2000-06-07
  • 打赏
  • 举报
回复
致kxy & Lin:
非常感谢两位的指点,我的问题基本上解决了。
不过,再顺便请教一下,如果我想用UDP的方法,如procedure ReadStream(DataStream: TStream);来接受几乎和上述结构相同的混合数据结构,并且要从所接收到的结构中取出某个元素来同此前预先定义好的一常量进行比较确认,如从接收的数据结构中取出Client_Applic_Name同一字串常量比较,那么我应该采用什么方式来存储接收到的数据,又如何访问其中的元素呢?(接收的数据结构同上)
非常希望能有所赐教,谢谢!

kxy 2000-06-07
  • 打赏
  • 举报
回复
或者使用Packed关键字;
TMyRec = packed record
你可以看看packed的帮助.
kxy 2000-06-07
  • 打赏
  • 举报
回复
Lin说的没错,是字长对齐导致的.
改为
type
{$A-}
TMyRec=record
Message_type:word;
Client_Applic_Name:array [0..15] of char;
Link_Number:word;
Serial_Number:dword;
Server_Applic_Name:array [0..15] of char;
Server_Applic_Instance:word;
Session_type:word;
Inactivity_timeout:word;
end;
{$A+}

Lin 2000-06-07
  • 打赏
  • 举报
回复
结构一般是按机器字长对齐的,可以提高访问速度。另外,最好将几个Word放在一起来定义Record。可以用{$A-}关闭对齐选项。
kxy 2000-06-06
  • 打赏
  • 举报
回复
尾加0,16字节;是指全部16还是16+1?
TMyRec = record
MessageType : word;
Client_Applic_Name : array[0..15] of char;
......
end;

var
MyRec : TMyRec;
TempStream : TMemoryStream;
begin
//我只是示例,你要分配tempStream;
TempStream.Write(MyRec,sizeof(TMyRec));
Udp.SendStream(TempStream);
end;
用sendBuffer也可以,定义一个 TempMem: array of Char;然后分配内存
把MyRec的内容move倒TempMem就可以了.
kxy 2000-06-06
  • 打赏
  • 举报
回复
结购中为word,dword,string是给人看的,
如果你定义了一个record在内存中还不是一个一个的字节排起来.
delphi中的String比较特出它的前两个字节是一个integer用来表示strig的长度
如果两头都是你写的,用string也可以.不过看格式要用array[0..15] of char

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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