Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
14-24691
Romkin
2003-08-19 15:11
2003.09.08
Еще про самолет :)


11-24403
Vox
2002-12-30 20:10
2003.09.08
Все WM_KEYDOWN форме!


1-24428
Agent_03
2003-08-26 00:35
2003.09.08
Печать Landscape


3-24342
Sash2
2003-08-19 11:56
2003.09.08
Проблема с переносом полей.


3-24360
WASYA
2003-08-17 14:39
2003.09.08
Сохранение результатов SQL запроса (вопрос наверное избитый)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский