求救:idUdpServer接收数据出错?

lqwxfdwj 2006-09-26 02:34:47
....
type
//包头
THead = record
ID: Integer;
end;

//请求方
TAckFileInfo = record //文件信息
FileSize: Integer;
FileName: array [0..1024] of char;
end;

TAckData = record
pieceBuf: array [0..1024] of Char; //文件块。
Length: Word; //长度
end;

TAckBag = packed Record
Head: THead;
AckFileInfo: TAckFileInfo;
AckData: TAckData;
end;
pAckBag = ^TAckBag;

//回复方
TReqType = record
ID: Integer; //0:传输 1:取消 2: 完成
end;

TReqData = record //包体部分
Length: Word;
StartPos: Integer;
end;

TReqBag = packed record //整包.
Head: THead;
ReqType: TReqType;
ReqData: TReqData;
end;
pReqBag = ^TReqBag;

form1 = class(form)
.....

在接收收据的过程中出现错误.
//TBytes = array of Byte;

procedure TForm1.UdpServerUDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);
var
ReqBag: pReqBag;
AckBag: PAckBag;
Buf: TBytes;
MsgFrm: TMsgFrm;
begin
New(AckBag);
New(ReqBag);

CopyMemory(@AckBag,@AData,SizeOf(AData));

Dispose(Ackbag); //在这儿报错。
.....

我新建立一个new(Ackbag)
将收到的数据保存到Ackbag结构里,
然后释放.
但为什么释放的时候会报错呢?是不是在执行copymemory的方法的时候,改变了原来的地址呢?如果是的,哪我怎么保存接收到传进来的数据到结构中啊?
...全文
276 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
StanderLai 2006-09-30
  • 打赏
  • 举报
回复
CopyMemory之前先给没有指指定内存大小。
spirit_sheng 2006-09-30
  • 打赏
  • 举报
回复
CopyMemory(@AckBag,@AData,SizeOf(AData));
你的这句有问题
改为
CopyMemory(AckBag, AData, sizeof(TAckBag));

试试
lqwxfdwj 2006-09-29
  • 打赏
  • 举报
回复
都过去好多日了,看来天下是没有知道了。
budwn 2006-09-29
  • 打赏
  • 举报
回复
不要重新分配空間的吧,你定義的是結構體變量,又不是指針變量,結構體變量和一般變量一樣用法。
MsgInfo = record
msgtype:TMsgType;
nikename:array [0..9] of char;
sex: array [0..3] of char;
from_ip: array [0..15] of char;
to_ip: array [0..15] of char;
info: array [0..1023] of char;
end;
procedure TfrmMain.UDPClientUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
msg: MsgInfo;
OnlineList:string;
begin
//諉彶陓洘
FillChar(msg, sizeof(msg), #0);
try
AData.Read(msg, sizeof(msg));
except
on exception do
begin
MessageDlg('諉彶陓洘囮啖ㄐ', mtWarning, [mbOK], 0);
Exit;
end;
end;
if (msg.msgtype = ONLIE_LIST) then
begin
islogin := True;
memRecv.Lines.Add('腎翹傖髡ㄐ');
OnlineList:= msg.info;
ParseList(OnlineList);
end
else if (msg.msgtype = INFO) then
memRecv.Lines.Add(msg.nikename + 'ㄩ' +msg.info)
end;
可以參考
kingfather 2006-09-27
  • 打赏
  • 举报
回复
不知
lqwxfdwj 2006-09-26
  • 打赏
  • 举报
回复
没有人知道的吗?就是一个数组转换成结构变量的问题。大家都不知道的么?
lqwxfdwj 2006-09-26
  • 打赏
  • 举报
回复
顶1

1,593

社区成员

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

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