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字段再生成其他结构体来区分结构体是什么。所以必须要使用不定长的结构体。请大侠们帮帮忙。 展开
定义了一个结构体如下
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字段再生成其他结构体来区分结构体是什么。所以必须要使用不定长的结构体。请大侠们帮帮忙。 展开
1个回答
展开全部
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;
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;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询