Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.013 c
14-24698
Daniel
2003-08-19 12:06
2003.09.08
Недавно хорошую фразу вычитал в книге по админигу Соляры


14-24702
VD602
2003-08-19 12:01
2003.09.08
Совершенно неубиваемый процесс!


3-24343
Groove_SQL
2003-08-18 08:45
2003.09.08
ORDER BY вычисляемое поле


4-24737
mikky
2003-07-08 11:49
2003.09.08
вайловые операци


7-24726
Diamond Dog
2003-06-25 19:35
2003.09.08
Отключение выбора режима загрузки винды при нажатии F8