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

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

Получение данных через TCP соединение [D7, Win2k]


Tor ©   (2005-09-09 09:51:00) 

Доброго времени суток любезный ALL!
Вот такая проблема: с клиента отправляю рекорд(record). А на сервере пытаюсь прочитать этот рекорд в массив. Если же на сервере читать в рекорд то все проходит на ура. Но мне надо именно в массив, но почемуто он не заполняется, вот пример кода.

TOpenCash = record
   Mode: Byte;
   Password: Longword;
end;
FDataArray : Array [0..15999] of Byte;
POpenCash : ^TOpenCash;
...
procedure TDM.TCPServerExecute(AThread: TIdPeerThread);
var
 PData: Pointer;
 I: Byte;
begin
 PData := Addr(FDataArray[0]);
 try
   AThread.Connection.ReadBuffer(PData, SizeOf(FDataArray));
 except
   {}
 end;
 POpenCash := PData;
 I := POpenCash.Mode;
end;


Tor   (2005-09-09 10:59:00) [1]

сори звтыкал :) Код не копировал и у себя сначала объявил как запись а не указатель


Digitman   (2005-09-09 10:57:00) [2]


>  PData надо объявлять не как рекорд, а как указатель


здрасть-приехали !

а это что

PData: POpenCash;

?

объявления

PData: ^POpenCash;
и
PData: POpenCash; //где POpenCash = ^TOpenCash;

абсолютно эквивалентны !


> если с клиента отправляеться сначало один символ, потом
> рекорд. На сервере можно все прочитать в один массив за
> раз или тоже надо читать несколько раз?


да как угодно) .. разницы нет никакой


Tor   (2005-09-09 10:50:00) [3]

Фенкс получилось, но только, PData надо объявлять не как рекорд, а как указатель, т.е.
PData: ^POpenCash;
Спасибо :)
А вот такой вопрос: если с клиента отправляеться сначало один символ, потом рекорд. На сервере можно все прочитать в один массив за раз или тоже надо читать несколько раз?


Digitman   (2005-09-09 10:32:00) [4]

POpenCash = ^TOpenCash;
TOpenCash = packedrecord
  Mode: Byte;
  Password: Longword;
end;

FDataArray : Array [0..15999] of Byte;
...

procedure TDM.TCPServerExecute(AThread: TIdPeerThread);
var
PData: POpenCash;
I: Byte;
begin
PData := @FDataArray;
try
  AThread.Connection.ReadBuffer(PData^, SizeOf(PData^));
  I := PData.Mode;
except
  {}
end;
end;


Tor   (2005-09-09 10:15:00) [5]

Ты хош сказать что оно ждет приема отстальных 16000 - 16 байт. Точно что то и в голову не пришло. Так какже тогда всеж получить эту рекод. посылать сначало ее размер, а тока потом читать в массив?


Digitman   (2005-09-09 10:06:00) [6]

нестыковка получается ..

отправляешь SizeOf(TOpenCash) = 16 байт, а принимать пытаешься почему-то SizeOf(FDataArray) = 16000 байт

?


Наверх

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