请问SendBuffer(var Buffer; Count Integer)中Buffer的用途 ( 积分: 100 )

  • 主题发起人 主题发起人 匪匪
  • 开始时间 开始时间

匪匪

Unregistered / Unconfirmed
GUEST, unregistred user!
在函数SendBuffer(var Buffer; Count Integer)中,有一个参数Buffer,是无类型的变量,我在程序中用指针操作时,碰到个问题。
procedure TForm1.BitBtn2Click(Sender: TObject);
var
TempMessageHead: pMessageHead;
TempLogin: pLogin;
TempStream: TMemoryStream;
TempMessageBlock: pMessageBlock;
begin
//登录,发送相应的登录消息
New(TempLogin);
New(TempMessageBlock);
FillChar(TempLogin^, Sizeof(TempLogin), 0);
New(TempMessageHead);

FillChar(TempMessageHead^, Sizeof(TempMessageHead), 0);
IdUDPClient.Host := Edit1.Text;
IdUDPClient.Port := StrToInt(Edit2.Text);
IdUDPClient.Active := True;
TempLogin^.Host := IdUDPClient.Host;
TempLogin^.Port := IdUDPClient.Port;
TempLogin^.UserName := Edit3.Text;

TempMessageHead.Flag := tHead;
TempMessageHead.Sender := tQQUser;
TempMessageHead.Receiver := tQQServer;
TempMessageHead.MsgType := tMsgType_Login;
TempMessageHead.ReceiveIP := IdUDPClient.Host;
TempMessageHead.ReceivePort := IntToStr(IdUDPClient.Port);
TempMessageHead.MsgLength := Sizeof(TempMessageHead) + Sizeof(TempLogin);

///////////////

FillChar(TempMessageBlock.Content.Content, 7000, 0);
TempStream := TMemoryStream.Create;
TempStream.WriteBuffer(TempMessageHead^, SizeOf(pMessageHead));
TempStream.Seek(0, soFromEnd);
TempStream.WriteBuffer(TempLogin^, SizeOf(pLogin));
TempStream.Seek(0, soFromBeginning);
[blue] TempStream.ReadBuffer(TempMessageBlock^, Sizeof(pMessageBlock)); [/blue]//此处的TempMessageBlock中的值与上面的不一致。
JLogin(TempMessageBlock);
TempStream.Free;
Dispose(TempMessageHead);
Dispose(TempMessageBlock);
Dispose(TempLogin);


//显示发送请求在窗口中
// DisplayToMemo();
end;
上面的语句中若用TempMessageBlock^作参数,参数没错,可是结构中的数据与上面的两个结构不一致,但是如果是用TempMessageBlock,则程序出错,是失放指针出错,但结构中的内容却是对的。请问加^与不加在这个程序里面究竟有什么区别?
 
在函数SendBuffer(var Buffer; Count Integer)中,有一个参数Buffer,是无类型的变量,我在程序中用指针操作时,碰到个问题。
procedure TForm1.BitBtn2Click(Sender: TObject);
var
TempMessageHead: pMessageHead;
TempLogin: pLogin;
TempStream: TMemoryStream;
TempMessageBlock: pMessageBlock;
begin
//登录,发送相应的登录消息
New(TempLogin);
New(TempMessageBlock);
FillChar(TempLogin^, Sizeof(TempLogin), 0);
New(TempMessageHead);

FillChar(TempMessageHead^, Sizeof(TempMessageHead), 0);
IdUDPClient.Host := Edit1.Text;
IdUDPClient.Port := StrToInt(Edit2.Text);
IdUDPClient.Active := True;
TempLogin^.Host := IdUDPClient.Host;
TempLogin^.Port := IdUDPClient.Port;
TempLogin^.UserName := Edit3.Text;

TempMessageHead.Flag := tHead;
TempMessageHead.Sender := tQQUser;
TempMessageHead.Receiver := tQQServer;
TempMessageHead.MsgType := tMsgType_Login;
TempMessageHead.ReceiveIP := IdUDPClient.Host;
TempMessageHead.ReceivePort := IntToStr(IdUDPClient.Port);
TempMessageHead.MsgLength := Sizeof(TempMessageHead) + Sizeof(TempLogin);

///////////////

FillChar(TempMessageBlock.Content.Content, 7000, 0);
TempStream := TMemoryStream.Create;
TempStream.WriteBuffer(TempMessageHead^, SizeOf(pMessageHead));
TempStream.Seek(0, soFromEnd);
TempStream.WriteBuffer(TempLogin^, SizeOf(pLogin));
TempStream.Seek(0, soFromBeginning);
[blue] TempStream.ReadBuffer(TempMessageBlock^, Sizeof(pMessageBlock)); [/blue]//此处的TempMessageBlock中的值与上面的不一致。
JLogin(TempMessageBlock);
TempStream.Free;
Dispose(TempMessageHead);
Dispose(TempMessageBlock);
Dispose(TempLogin);


//显示发送请求在窗口中
// DisplayToMemo();
end;
上面的语句中若用TempMessageBlock^作参数,参数没错,可是结构中的数据与上面的两个结构不一致,但是如果是用TempMessageBlock,则程序出错,是失放指针出错,但结构中的内容却是对的。请问加^与不加在这个程序里面究竟有什么区别?
 
你用tempMessageBlock^, 没错, 是你SizeOf用错了, 你获得是的指针的长度, 而不是
指针指向内容的长度...
 
内存流读写数据:
读:SetLength(S, MemoryStream.Size);
MemoryStream.Read(Pointer(S)^, Length(S));
写:MemoryStream.Write(Pointer(S)^, Length(S));
有人喜欢用MemoryStream.Read(S[1], Length(S))这样的语句,这在流中有数据的时候不会有问题,而对于流中没有数据的情况,SetLength(S, MemoryStream.Size)后的S就是个空字符串,S[1]会引发异常的。
 
to tseug:
我想你说的是对的,我读的是指针的大小,我知道了,是不是应该是指针指向结构。这样写对吗?sizeof(tMessageBlock) ,tMessageBlock是结构体名。。这样应该没有问题了吧。
那加那个^后,我读出来的内容不对。。。不加^倒是对的。。。。这是为什么,加与不加^有什么区别?
 
to yostgxf:
S是什么类型的变量。我是要在网络中把结构传过去,应该不能传指针吧。现在我改成结构体了,但是问题又出来了,,,读流时出错。程序代码这样的。
procedure TForm1.BitBtn2Click(Sender: TObject);
var
TempMessageHead: TMessageHead;
TempLogin: TLogin;
TempStream: TMemoryStream;
TempMessageBlock: TMessageBlock;
begin
//登录,发送相应的登录消息
IdUDPClient.Host := Edit1.Text;
IdUDPClient.Port := StrToInt(Edit2.Text);
IdUDPClient.Active := True;
TempLogin.Host := IdUDPClient.Host;
TempLogin.Port := IdUDPClient.Port;
TempLogin.UserName := Edit3.Text;
TempMessageHead.Flag := tHead;
TempMessageHead.Sender := tQQUser;
TempMessageHead.Receiver := tQQServer;
TempMessageHead.MsgType := tMsgType_Login;
TempMessageHead.ReceiveIP := IdUDPClient.Host;
TempMessageHead.ReceivePort := IntToStr(IdUDPClient.Port);
TempMessageHead.MsgLength := Sizeof(TempMessageHead) + Sizeof(TempLogin);
///////////////
TempStream := TMemoryStream.Create;
try
TempStream.WriteBuffer(TempMessageHead, SizeOf(TempMessageHead));
TempStream.Seek(0, soFromEnd);
TempStream.WriteBuffer(TempLogin, SizeOf(TempLogin));
TempStream.Seek(0, soFromBeginning);
[blue] TempStream.ReadBuffer(TempMessageBlock, SizeOf(TempMessageBlock));[/blue]
finally
TempStream.Free;
end;
JLogin(TempMessageBlock);
end;
运行到蓝色的地方出错,read stream error
 
我其实在这里面主要是想把TempLogin与TempMessageHead合成一个结构,这个合成的结构就是TempMessageBlock,我只知道用流来处理,但是出错了,请问该怎么做,才能将两个结构合成一个。
 
结构体如下:
pMessageHead = ^tMessageHead;
tMessageHead = Record
Flag : Byte;
Sender : Byte;
Receiver : Byte;
MsgType : Byte;//报文类型
MsgLength : Dword;
ReceiveIP : string;
ReceivePort : string;
end;
{*********消息具体内容***********}
pMessageBody = ^tMessageBody;
tMessageBody = Record
Content : array [0..7000] of Byte;
end;
{*****消息体*****}
pMessageBlock= ^tMessageBlock;
tMessageBlock = Record
Head : tMessageHead;
Content : tMessageBody;
end;
{*******登录***********}
pLogin = ^TLogin;
TLogin = Record
Host : String;
Port : Integer;
UserName : String;
end;
 
怎么跟你说呢,WriteBuffer(var Buffer, )中的buffer需要你传一个buffer的首地址。
S的类型,可以是动态数组,结构什么的。
[blue] TempStream.ReadBuffer(TempMessageBlock, SizeOf(TempMessageBlock));[/blue]
改为:TempStream.ReadBuffer(Pointer(TempMessageBlock)^, SizeOf(TempMessageBlock))
 
我试试,加我QQ:39576450
 
加了不行啊。提示说invalid typecast
 
>>我其实在这里面主要是想把TempLogin与TempMessageHead合成一个结构,这个合成的结构就是TempMessageBlock
真的看不明白你想干什么,看看你tMessageBlock的定义
tMessageBlock = Record
Head : tMessageHead;
Content : tMessageBody;
end;
完全和TLogin没有关系,怎么能写入tMessageHead和TLogin读出tMessageBlock呢,不错才怪呢,而且,代码中问题多多
 
多人接受答案了。
 
后退
顶部