Форум: "Сети";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
ВнизПодскажите как передать Record через SendBuf Найти похожие ветки
← →
axx (2003-11-21 08:49) [0]Сабж. или ссылочку киньте.
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;
По этому примеру можно понять что мне требуется. Знаю что не работает так. Подскажите как надо делать .... :)))
Заранее спасибо.
← →
Reindeer Moss Eater (2003-11-21 08:52) [1]Вот так и надо дклать.
← →
axx (2003-11-21 08:54) [2]не передает. SizeOf(f) возвращает всегда одно и тоже значение не зависимо от заполнения рекорда. Я так понял f это указатель.
← →
Reindeer Moss Eater (2003-11-21 08:58) [3]SizeOf(f) возвращает всегда одно и тоже значение не зависимо от заполнения рекорда потому что размер этого рекорда всегда постоянен.
TRect=record
CodeID:Byte;
Value:PChar;
end;
Первое поле - один байт Второе поле - 4 байта
Плюс выравнивание комплилятора.
← →
axx (2003-11-21 09:11) [4]Но почему же не работает
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;
← →
Digitman (2003-11-21 09:18) [5]
> Но почему же не работает
почему-почему)
тебе ж сказали уже - в поле Value ты передаешь 4-байтный указатель на данные, а не сами данные
а этот указатель имеет смысл лишь в ВАП процесса-передатчика ... в ВАП же процесса приемника тот же (принятый) указатель не имеет смысла, и попытка получить данные (которых не существует, ибо никто их не передавал) по этому указателю ведет в конечном итоге в AV
← →
Reindeer Moss Eater (2003-11-21 09:18) [6]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;
← →
Reindeer Moss Eater (2003-11-21 09:22) [7]На приемном конце:
1. Считать 1 байт (это будет f.id)
2. Считать 4 байта (это длина строки)
3. Считать количество байтов равное длине строки (это будет f.Value)
← →
Е-Моё имя (2003-11-21 09:22) [8]
>> GetMem(p,SizeOf(Byte)+
>> Inc(pb);
тогда уж
Inc(pb,SizeOf(Byte));
:))
---
nil
← →
Reindeer Moss Eater (2003-11-21 09:26) [9]Нет.
Тогда по инерции кто-то напишет:
Inc(PLen,SizeOf(Cardinal));
← →
Reindeer Moss Eater (2003-11-21 09:27) [10]Типизированный указатель и его инкремент на единицу.
Это логично и стройно.
← →
Е-Моё имя (2003-11-21 09:28) [11]
>> Типизированный указатель
согласен, не заметил
---
nil
← →
Reindeer Moss Eater (2003-11-21 09:49) [12]Кстати, axx, а зачем такое экзотическое имя у твоего пользовательского типа?
← →
axx (2003-11-21 09:55) [13]Спасибо. Разобрался. Все заработало. А насчет имени - незнаю, так получилось.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c