Форум: "Сети";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
ВнизИспользование массивов переменной длинны при работе с 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c