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

Вниз

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

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

Наверх





Память: 0.47 MB
Время: 0.044 c
14-1106134833
Vlad Oshin
2005-01-19 14:40
2005.02.06
вопрос экономистам: цена на материнку и доски


1-1106390829
stone
2005-01-22 13:47
2005.02.06
Окружность вписанная в квадрат


4-1103182061
gdaujk
2004-12-16 10:27
2005.02.06
При нажатии TAB фокус не перескакивает с одного контрола на др.


6-1101410970
Strumpf
2004-11-25 22:29
2005.02.06
Определение места сайта в Яндексе


11-1089331291
Vladimyr
2004-07-09 04:01
2005.02.06
Rotated text - не вращается, хоть тресни...





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