Текущий архив: 2003.09.08;
Скачать: CL | DM;
Вниз
record и SendBuf ReceiveBuf Найти похожие ветки
← →
UserName (2003-07-03 20:47) [0]Всем привет! Подскажите плиз, как переслать запись посредством сокетов используя
Вот есть у меня тип данных, типа рекорд. ну там с полями всякими хитрыми, и т.д. Вопрос, как переслать это по сети с помощью сокетов. Мне очень не хочется пересылать каждое поле отдельной строкой и потом все это дело собирать обратно в запись. Мне гдето говорили что можно используя буферы можно послать любой тип данных. Правда ли это?
Оччччень прошу напишите плиз маленький примерчик отправки и получения записи! Вот например есть у меня такой тип
type TTest=record
f1:integer;
f2:string;
end;
и переменная скажем f:TTest; как мне сразу ее целиком отправить?
← →
Digitman (2003-07-04 17:37) [1]
> мне сразу ее целиком отправить
никак. пока в записи присутствуют поля динамического типа (в дан.случае - string), придется каждое поле посылать отдельно.
а вот такое поле - пожалуйста
type
TTest= PACKED record
f1:integer;
f2:string[..];
end;
var tst: TTest;
...
sendbuf(tst, sizeof(tst));
← →
UserName (2003-07-05 11:08) [2]Спасибо большое за ответ.
Хотелось бы спросить еще такую вещь. Допустим мне на сокет могут прислать разные записи с разными полями и т.д. Как мне определить какого типа пришла запись? Имхо тут надо вводить индетификаторы в каждую запись, и при получении буфера смотреть например первый его байт и в зависимости от значения получать его в разные переменные. Но как мне это сделать? Если не трудно, напишите маленький исходничек! =)
← →
Digitman (2003-07-07 08:10) [3]sendbuf(идентификатор_записи_TTest, sizeof(идентификатор_записи_TTest));
sendbuf(tst, sizeof(tst));
← →
Polevi (2003-07-07 10:39) [4]создай класс наследник TComponent, TStream.ReadComponent и TStream.WriteComponent позволят тебе писать и читать из потока published-свойства экземпляра, и создавать новые
MyMarshalObject:=MyStream.ReadComponent(nil);
PS
не забудь вызвать RegisterClass для твоего наследника
← →
Digitman (2003-07-07 10:55) [5]
> UserName
см. Polevi © (07.07.03 10:39)
Вполне, кстати, простое, изящное и современное решение !
в этом случае после успешного (!)
MyMarshalObject:=MyStream.ReadComponent(nil);
можно тут же определить класс объекта, переданного потоком по сети
if MyMarshalObject is TMyObject1 then
....
else if MyMarshalObject is TMyObject2 then
....
else
....
← →
Polevi (2003-07-07 11:15) [6]2Digitman © (07.07.03 10:55)
разовьем мысль :))
TMarshalObject=class(TComponent)
public
procedure Exec;virtual;abstract;
end;
TFuntionOne=class(TMarshalObject)
private
FParam1:integer;
public
procedure Exec;override;
published
property Param1:integer read FParam1 write FParam1;
end;
TFuntionTwo=class(TMarshalObject)
private
FParam1:integer;
FParam2:integer;
public
procedure Exec;override;
published
property Param1:integer read FParam1 write FParam1;
property Param2:integer read FParam2 write FParam2;
end;
TFunctionOne.Exec;
begin
ShowMessage(IntToStr(Param1));
end;
TFunctionTwo.Exec;
begin
ShowMessage(IntToStr(Param1+Param2));
end;
var
mo:TMarshalObject;
begin
mo:=TMarshalObject(TMyStream.ReadComponent(nil));
mo.Exec;
end;
чем не RPC ?
:)
← →
Digitman (2003-07-07 11:34) [7]
> Polevi
все верно)
примерно так и работает маршаллинг в BSS и TSocketConnection)
Страницы: 1 вся ветка
Текущий архив: 2003.09.08;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.007 c