Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-72736
goga
2004-01-11 08:37
2004.01.23
Сохранение Chart в Jpeg


9-72620
Toni
2003-07-06 04:59
2004.01.23
dxDraw


3-72634
Hyzhak
2003-12-24 19:33
2004.01.23
ADO и EInvalidOp , в чем связь???


3-72691
bon
2003-12-27 11:45
2004.01.23
SumList в DBGridEh


4-72983
JLS
2003-11-16 04:54
2004.01.23
Запуск плеера через разные звуковые адаптеры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский