onUdpREAD 事件接收数据(50分)

  • 主题发起人 主题发起人 lhcming
  • 开始时间 开始时间
L

lhcming

Unregistered / Unconfirmed
GUEST, unregistred user!
....
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的方法的时候,改变了原来的地址呢?如果是的,哪我怎么保存接收到传进来的数据到结构中啊?
 
再补充一点说明:
大家可能看到哪个结构有点烦心.
其实大意无非就这样的:我传输数据都是用的tidUdpServer(indy10)这个控件.客户端和服务器各一个tidudpserver.

首先定义一个结构.
pa=^Ta;
Ta = Record
...
end;
接收数据---
procedure TForm1.UdpServerUDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);
var
a:pa;
begin
new(a)

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

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

我的猜测是这样的:
在执行copymemory的时候,改变了原来的指定地址;以致于不能正常dispose(a).如果我的猜没有错的话,哪应该如何做呢?这个问题已经困扰了我一个星期了。
听说用链表(其实我也不懂链表),这样做行么?
在声明结构的时候:
type
pa=^ta
ta = record
...;
tmpa:pa; //在这里记住pa的实际地址?
end;
我也不知道我这样的想法对不对?
希望和大家共同讨论。
 
难道没有一个人知道怎么会事吗?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
1K
import
I
后退
顶部