![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
record и MemoryStream [D5, XP]
Юнкер © (2006-05-08 00:11:00)Я передаю от клиента серверу (UDPIndy) запись. Делаю так:
type raz = packed record
a,b,c,odin,dva,tri,chet,pat : integer;
end;
var
mypecord : raz;
mypecord.a := strtoint(Edit1.Text);
...........// заполняю запись
mypecord.pat := strtoint(Edit5.Text);
procedure TUDPMainForm.SendButtonClick(Sender: TObject);
var
mydata : TMemoryStream;
begin
mydata := TMemoryStream.Create;
mydata.Write(mypecord, SizeOf(mypecord));
// EncryptStream(mydata, mydata.Size, key); - здесь данные шифруются поэтому и использую MemoryStream
UDPClient.SendBuffer(mydata, sizeof(mydata));
получаю на сервере так:
type raz = packed record
a,b,c,odin,dva,tri,chet,pat : integer;
end;
var
mypecord : raz;
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
mydata : TMemoryStream;
begin
// try
mydata := TMemoryStream.Create;
AData.Position:=0;
AData.ReadBuffer(mydata, sizeof(mydata));
// DecryptStream(mydata, mydata.Size, key); расшифровываю
mydata.Read(mypecord, SizeOf(mypecord));
А как сейчас данные из mydata поместить в mypecord ?
Я вообще-то правильно делаю?
Юнкер (2006-05-08 17:54:00) [1]Во, сам разобрался.
Раз тут никто не знает :) выложу, может кому-нибудь пригодтся :)
type raz = packed record
a,b,c,odin,dva,tri,chet,pat : integer;
end;
var
mypecord : raz;
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
mydata : TMemoryStream;
begin
// try
mydata := TMemoryStream.Create;
AData.Position:=0; //надо!
mydata.CopyFrom(AData, AData.Size);
mydata.Position := 0;
mydata.Read(mypecord, SizeOf(mypecord));
Юнкер (2006-05-08 13:30:00) [2]Помогите кто-нибудь.
Покажите как грамотные люди отправляют MemoryStream через idUDPClient. Плз.
Юнкер (2006-05-08 09:51:00) [3]
> Сначала копируй данные для отправки в промежуточный буфер,
> его затем и посылай.
А сразу MemoryStream послать нельзя что ли?
Так тоже не получается: UDPClient.SendBuffer(mydata.memory^, mydata.Size);
Можно пример как правильно отправить MemoryStream ? Я сам чевота не могу разобраться.
Пусик (2006-05-08 01:50:00) [4]
> Юнкер (08.05.06 01:08) [3]
> А я правильно посылаю:
> ?
Конечно нет.
В качестве первого параметра у тебя указан TStream, а в качестве второго - размер указателя на него.
Сначала копируй данные для отправки в промежуточный буфер, его затем и посылай.
Юнкер (2006-05-08 01:08:00) [5]Неработает :(
А я правильно посылаю:
var
mydata : TMemoryStream;
UDPClient.SendBuffer(mydata, sizeof(mydata));
?
Пусик (2006-05-08 00:26:00) [6]
> Юнкер (08.05.06 00:14) [1]
>
> В коде на сервере:
>
> > mydata.Read(mypecord, SizeOf(mypecord));
>
> Это вроде не работает. Как правильно сделать? Помогите плз.
>
>
Почему не работает? Все правильно.
Вот пример. Работает как надо.
var
mr1,mr2: TMyRecord;
MS: TMemoryStream;
begin
mr1.n1 := 100;
mr1.n2 := 200;
MS := TMemoryStream.Create;
try
MS.Write(mr1,SizeOf(TMyRecord));
Ms.Position := 0;
MS.Read(mr2,SizeOf(TMyRecord));
ShowMessage(IntToStr(mr2.n1)+'/'+IntToStr(mr2.n2));
finally
MS.Free;
end;
Юнкер (2006-05-08 00:14:00) [7]В коде на сервере:
> mydata.Read(mypecord, SizeOf(mypecord));
Это вроде не работает. Как правильно сделать? Помогите плз.