Текущий архив: 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.036 c