Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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));

Это вроде не работает. Как правильно сделать? Помогите плз.


Наверх

Титульная страница Поиск, карта сайта Написать письмо