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

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

Подскажите как передать Record через SendBuf [D6, Win2k]


axx ©   (2003-11-21 08:49:00) 

Сабж. или ссылочку киньте.

type
PRect=^TRect;
TRect=record
CodeID:Byte;
Value:PChar;
end;

Procedure .....
var
f:TRect;
begin
F.CodeID:=1;
F.Value:="Hi";
Socket.SendBuf(F,SizeOf(F));
end;

По этому примеру можно понять что мне требуется. Знаю что не работает так. Подскажите как надо делать .... :)))
Заранее спасибо.


axx   (2003-11-21 09:55:00) [1]

Спасибо. Разобрался. Все заработало. А насчет имени - незнаю, так получилось.


Reindeer Moss Eater   (2003-11-21 09:49:00) [2]

Кстати, axx, а зачем такое экзотическое имя у твоего пользовательского типа?


Е-Моё имя   (2003-11-21 09:28:00) [3]


>> Типизированный указатель

согласен, не заметил

---
nil


Reindeer Moss Eater   (2003-11-21 09:27:00) [4]

Типизированный указатель и его инкремент на единицу.
Это логично и стройно.


Reindeer Moss Eater   (2003-11-21 09:26:00) [5]

Нет.
Тогда по инерции кто-то напишет:
Inc(PLen,SizeOf(Cardinal));


Reindeer Moss Eater   (2003-11-21 09:22:00) [6]

На приемном конце:
1. Считать 1 байт (это будет f.id)
2. Считать 4 байта (это длина строки)
3. Считать количество байтов равное длине строки (это будет f.Value)


Е-Моё имя   (2003-11-21 09:22:00) [7]


>> GetMem(p,SizeOf(Byte)+


>> Inc(pb);

тогда уж
Inc(pb,SizeOf(Byte));
:))

---
nil


Digitman   (2003-11-21 09:18:00) [8]


> Но почему же не работает


почему-почему)

тебе ж сказали уже - в поле Value ты передаешь 4-байтный указатель на данные, а не сами данные

а этот указатель имеет смысл лишь в ВАП процесса-передатчика ... в ВАП же процесса приемника тот же (принятый) указатель не имеет смысла, и попытка получить данные (которых не существует, ибо никто их не передавал) по этому указателю ведет в конечном итоге в AV


Reindeer Moss Eater   (2003-11-21 09:18:00) [9]

procedure SendMyRec(f:TMyRect);
var p:Pointer; pB:PByte; pLen : ^Cardinal;
begin
GetMem(p,SizeOf(Byte)+SizeOf(Cardinal)+StrLen(f.Value));
pb:=p;
pb^:=f.CodeID;
Inc(pb);
pLen := Pointer(pb);
pLen^:=StrLen(f.Value);
Inc(PLen);
StrCopy(PChar(PLen),f.Value);
Socket.SendBuff(p^,SizeOf(Byte)+SizeOf(Cardinal)+StrLen(f.Value));
end;


axx   (2003-11-21 09:11:00) [10]

Но почему же не работает

TRect=record
CodeID:Byte;
Value:PChar;
end;

//Server
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyRect: TRect;
Begin
MyRect.CodName:=233;
MyRect.Value:="Hi";
Socket.SendBuf(MyRect,Sizeof(MyRect));
end;
//Client
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyRect: TRect;
begin
Socket.ReceiveBuf(MyRect,Socket.ReceiveLength);
ShowMessage(MyRect.Value) возвращает " "
end;


Reindeer Moss Eater   (2003-11-21 08:58:00) [11]

SizeOf(f) возвращает всегда одно и тоже значение не зависимо от заполнения рекорда потому что размер этого рекорда всегда постоянен.

TRect=record
CodeID:Byte;
Value:PChar;
end;

Первое поле - один байт Второе поле - 4 байта
Плюс выравнивание комплилятора.


axx   (2003-11-21 08:54:00) [12]

не передает. SizeOf(f) возвращает всегда одно и тоже значение не зависимо от заполнения рекорда. Я так понял f это указатель.


Reindeer Moss Eater   (2003-11-21 08:52:00) [13]

Вот так и надо дклать.


Наверх

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