Главная страница
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-24646
SerVel
2003-08-21 18:33
2003.09.08
interrupt


14-24634
Пробегал тут...
2003-08-21 01:01
2003.09.08
Фильтрованное из humor.filtered


14-24632
Sargos
2003-08-21 13:33
2003.09.08
Из жизни...


14-24672
Mike_Goblin
2003-08-20 12:23
2003.09.08
Anekdot.ru - рулит


3-24373
Alek_1
2003-08-13 02:42
2003.09.08
MySql vs FireBird!