delphi 使用UDP发送结构体问题

Delphi语言定义了一个结构体如下SendStruct=recordASize:Integer;Name:array[0..0]ofansichar;end;发送数据代... Delphi 语言
定义了一个结构体如下
SendStruct = record
ASize: Integer;
Name: array[0..0] of ansichar;
end;

发送数据代码为
str := 'Hello!';
New(p);
p^.ASize := Length(str);
Move(str[1], p^.Name, p^.ASize);
IdUDPClient1.SendBuffer(p^, SizeOf(SendStruct));
发送时候p结构中数据是正确的,

接收时候的代码如下。但是接收到的数据是错误的。而且报指针错误。
New(p);
AData.Read(p^, AData.Size);

如果结构体中的数组是定长的接收就正确。但是我需要的就是发送不同的结构体在服务端再根据结构提中的Name字段再生成其他结构体来区分结构体是什么。所以必须要使用不定长的结构体。请大侠们帮帮忙。
展开
 我来答
0xCEA4
2012-10-15 · TA获得超过310个赞
知道小有建树答主
回答量:444
采纳率:100%
帮助的人:314万
展开全部
SendStruct = record
ASize: Integer;
Name: array[0..0] of ansichar;
end;
你这样定义结构后,你就不能用new来分配内存了,因为用new长度就算不对了,所以要用getmem,自己算要分配的长度。比如下面:
var p:PSendStruct;
s:string;
len:Integer;
begin
s:='hello';
len:=sizeof(TSendStruct)+length(s);
getMem(p,len);
FillChar(p^,len,0);
p^.ASize:=len;
move(s[1],p^.Name,length(s));
//self.Caption:=pchar(@p^.Name);
IdUDPClient1.SendBuffer(p^, len);
freeMem(p);
end;
接收的时候类似,也用getmem分配。udp发送的数据包大小是有限制的(好象1024字节),所以如果你的数据包大过这个限制,你还得自己分包。
另外,定义网络发送的结构,最好加上packed关键字,结构会小不少。比如:
SendStruct =packed record
ASize: Integer;
Name: array[0..0] of ansichar;
end;
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式