Главная страница
    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.47 MB
Время: 0.023 c
14-1105804196
Беспечный_Ангел
2005-01-15 18:49
2005.02.06
Создание и работа с ISO образом


1-1106648348
Aleks
2005-01-25 13:19
2005.02.06
Как перехватить ошибку


14-1105370530
Василий
2005-01-10 18:22
2005.02.06
Товарищи, а у вас есть сайт?


3-1104317212
Russko
2004-12-29 13:46
2005.02.06
Связка 2-х баз данных в одном запросе


1-1106668601
CAMCOH
2005-01-25 18:56
2005.02.06
Русские буквы в форме





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский