Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Как ловчее передать сложную структуру, у которой различный размер   Найти похожие ветки 

 
KarpEn   (2004-11-21 02:07) [0]

например такую:
infclient=class
   name:string;
   podpiska:TStringList;
   ready:boolean;
   constructor create;
   destructor destroy;override;
end;

Я сначала подумал, что можно так:

var explist:infclient;
clientsocket1.Socket.SendBuf(explist,sizeof(explist));

а у сервера я написал

explist:^infclient;
     size:integer;
     p:pointer;

begin
 size:=socket.ReceiveLength;
 GetMem(p,size);
 socket.ReceiveBuf(p,size);
 explist:=p;
 treenode:=treeview1.Items.Add(nil,explist^.name);

но, конечно, не заработало, даже догадываюсь почему :)
Единственное, что в голову приходит - передавать все по отдельности, строчечками со служебными символами, как бы "протокол передачи данных" :) типа

clientsocket1.socket.sendtext("<name>"+explist.name+";")

и так с каждым членом, а на сервере разбирать при помощи строковых функций, но как же это запарно. Что умный и ленивый программист сделал бы?


 
Piter ©   (2004-11-21 02:49) [1]

KarpEn   (21.11.04 2:07)
Что умный и ленивый программист сделал бы?


передача экземпляра класса - это круто, но боюсь слишком трудоемкая и никому не нужная задача. Тебе что нужно то? Передать какие-то параметры?
Так передавай их... Если параметров много и не хочется их все поочередно передавать - передавай скопом, используй записи, аля:

TRec = packed record
 Name: s: string[80];
 ready: boolean;
 Number: integer;
end
;

после чего:

var explist:TRec;
clientsocket1.Socket.SendBuf(@explist, sizeof(explist));


а принимай так:

explist:TRec;
size:integer;

begin
 size:=socket.ReceiveLength;
 socket.ReceiveBuf(@explist, size);
 treenode:=treeview1.Items.Add(nil,explist.name);


Но это я только на примере, код кривой. Пишу его с руки - могут быть ошибки.
Плюс нужно учесть что TCP/IP пакеты могут фрагментироваться и доставляться по частям, нужно контролировать, что структура полностью передана, ну и т.д.
Это просто набросок... все.. я спать хочу...

ах да... будь осторожнее с динамическими типами, аля string, TStringList - их там просто в структуре не передашь, там будет хранится только указатель на участок памяти, где они находятся...


 
KarpEn   (2004-11-21 04:08) [2]

/передача экземпляра класса - это круто, но боюсь слишком трудоемкая и никому не нужная задача/
Я, может, плохо представляю себе всю эту внутреннюю механику, по мне класс - запись плюс методы, почему бы не передать эту запись?
удь осторожнее с динамическими типами, аля string, TStringList - их там просто в структуре не передашь, там будет хранится только указатель на участок памяти, где они находятся...
Так у меня потому и не работает ничего. А что делать? В твоем примере ты стринглист выкинул, а он был важен. У меня клиент на сервер должен закинуть несколько строчек типа Name=Value, а сколько их будет, и какой они длины - неизвестно. Я их решил в стринглисте хранить, а с передачей проблемы.


 
Piter ©   (2004-11-21 11:39) [3]

Ну к каждому динамическому типу нужен свой подход...
Что касается TStringList - то даже не знаю как поступить. Хорошо было бы сохранить его в поток, а потом этот поток передать, но он не имеет соответствующих методов. Может, народ что подскажет...

Так что пока вижу только передачу ручками, перебирая элементы его массива, у на удаленной стороне принимая и заполняя свой TStringList - не так уж это и сложно...


 
Anatoly Podgoretsky ©   (2004-11-21 13:51) [4]

KarpEn   (21.11.04 04:08) [2]
стринглист это означает определенное количество строк и определенные длины, ни какой речи об определенности и речи быть не может.


 
Мастер ©   (2004-11-21 16:04) [5]

>(21.11.04 04:08)

Тебе уже указали принцип.
Передавать нужно не TStringList, а TStringList.Text с указангием длины передаваемых данных - общий принцип.


 
KarpEn ©   (2004-11-21 21:51) [6]

Я знаю, меня не интересует такая передача. Весь вопрос в том, что сделать, чтобы потом ничего не делать. Я сейчас вот на что наткнулся. Если сделать объект наследником TRemotable, то у него будет метод ObjectToSOAP, который returns the XML for the newly generated node. В таком виде его передать, а там сделать SOAPToObject. Только как все это работает, и что конкретно сделать, я пока не знаю.


 
Rouse_ ©   (2004-11-22 22:32) [7]

Структура тебе известна? Известна. SaveToStream и отправляй куда тебе угодно, а на месте принимай...



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
9-1099470111
.dn
2004-11-03 11:21
2005.02.06
"ЧЕЛ"&amp;ДОРОГА


3-1105100023
Lucifer
2005-01-07 15:13
2005.02.06
Создание програмно псевданима DB MSAccess


14-1106235699
ferr
2005-01-20 18:41
2005.02.06
Физика 11 кл.


14-1105870540
REA
2005-01-16 13:15
2005.02.06
Игра "Монолит"


4-1103276198
Neznaika
2004-12-17 12:36
2005.02.06
"Живые" ярлыки