Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.28;
Скачать: CL | DM;

Вниз

Использование массивов переменной длинны при работе с Socket   Найти похожие ветки 

 
RUS1   (2003-03-05 08:49) [0]

Добрый день господа!!!!
Уважаемые господа подскажите пожалуста можно ли при передаче клиенту методом SendBuf типа Record использовать внутри етой записи массивы переменной длины (зарание длина масссива не известна).??
С уважением RUS/


 
Digitman ©   (2003-03-05 08:54) [1]

отчего ж нельзя ? можно)

смотри, к примеру, как реализованы методы TDataBlockInterpreter.Readvariant/WriteVariant (модуль SConnect).

эти методы читают/записывают из/в поток данные вариантного типа, в т.ч. являющиеся массивами перем.длины.
надеюсь, уже сформированный поток принять/передать не составит труда


 
RUS1   (2003-03-05 10:03) [2]

Значит так если делаю вот так:
Сервер:
Type
TData = Record
Name :String[10];
Data :varVariant;
end;
var MyData :TData;
begin
MyData.Data:=VarArrayCreate([1,1],varSingle);
VarArrayRedim(MyData.Data,2);
MyData.Name:="GOVNO";
MyData.Data[1]:=100;
MyData.Data[2]:=1.34;
ServerSocket1.Socket.Connections[0].SendBuf
(MyData,SizeOf(MyData));
end;

Клиент:
procedure TMainForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
Type
TData = Record
Name :String[10];
Data :varVariant;
end;
var MyData :TData;
begin
Socket.ReceiveBuf(MyData,SizeOf(MyData));
ClientMemo.Lines.Add(MyData.Name);
ClientMemo.Lines.Add(FloatToStr(MyData.Data[1]));
end;
то ничего не работает, даже если в клиенте ставить реальный размер записи (например в данном случае 32 байта,
ReceiveBuf(MyData,32) ) а если вот так:
Сервер:
Type
TData = Record
Name :String[10];
Data :Array [1..2] of Single;
end;
var MyData :TData;
begin
MyData.Name:="GOVNO";
MyData.Data[1]:=100;
MyData.Data[2]:=1.34;
ServerSocket1.Socket.Connections[0].SendBuf
(MyData,SizeOf(MyData));
end;

Клиент:
procedure TMainForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
Type
TData = Record
Name :String[10];
Data :Array [1..2] of Single;
end;
var MyData :TData;
begin
Socket.ReceiveBuf(MyData,SizeOf(MyData));
ClientMemo.Lines.Add(MyData.Name);
ClientMemo.Lines.Add(FloatToStr(MyData.Data[1]));
end;
второй вариант понятное дело работает и все окей!! Но почему первый вариант не работает??


 
Digitman ©   (2003-03-05 10:17) [3]


> почему первый вариант не работает??


потому что в действительности передается ссылка на вар.переменную (адрес ее упр.структуры) в ВАП передатчика, а не сами данные, которыми управляет вар.переменная на стороне передатчика

передача адреса попросту бессысленна, если передатчик и приемник находятся в разных виртуальных или физических адресных пространствах


 
RUS1   (2003-03-05 10:23) [4]

так как выйти из ситуации хоть кусочек кода малюсенький!!!! плиззззз!!!!


 
RUS1   (2003-03-05 10:36) [5]

ТАК КАК РЕШИТЬ ПРОБЛЕМУ С МАССИВАМИ ПЕРЕМЕННОЙ ДЛИНЫ, ГОСПОДА!!!


 
Digitman ©   (2003-03-05 11:01) [6]

см. Digitman © (05.03.03 08:54) !!



Страницы: 1 вся ветка

Текущий архив: 2003.04.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
3-91204
DukeNukem
2003-04-10 12:11
2003.04.28
Работа с гридом...


3-91154
alex _bredin
2003-04-09 10:35
2003.04.28
Индексы и SQL


14-91507
igorr
2003-04-10 14:52
2003.04.28
Ошибка завершения работы Windows


14-91536
Dudao
2003-04-11 05:27
2003.04.28
Opera


3-91170
Anton.
2003-04-09 14:30
2003.04.28
Как узнать пустой DBEdit или нет.