Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Вниз

Передача структуры по сокету 


evgen_2001   (2001-11-05 16:10) [0]

Помогите с сабжем!



panov   (2001-11-05 16:34) [1]

Как правило, в любых компонентах(из сокетных) есть метод Send, позволяющий передавать непрерывный буфер данных.
Если использовать packed record, то запись у тебя будет располагаться в непрерывном участке памяти.
Останется посчитать длину этой записи(как сумму длин всех полей).



Anatoly Podgoretsky   (2001-11-05 16:38) [2]

packed не обязательно



panov   (2001-11-05 16:42) [3]

>Anatoly Podgoretsky
Но тогда ведь между полями могут быть "дырки" в памяти?



Di_wind   (2001-11-05 17:44) [4]

а почему не зацинуть структуры в строку? разделяя поля каким-либо знаком к примеру * а на выходе опять преобразвововать в структуру, помойму так можно, если я неправ прошу поправить....



Anatoly Podgoretsky   (2001-11-05 18:00) [5]

panov © (05.11.01 16:42)
Конечно, ну и что, главное что бы с обоих концов использовали одинаковый метод упаковки структуры. Если же речь идет об платформон-независимом решении, то packed тем более недостаточно, надо дополнительно к нему использовать только фундаментальные типы.

Di_wind © (05.11.01 17:44)
Какая разница, а если это двоичные данные то и невозможно в принципе.



Alien   (2001-11-05 23:04) [6]

Обычно такие задачи решаются путём реализации методов SaveToStream и LoadFromStream, которые принимают указатель на базовый класс TStream. Практически все компоненты, которым требуется пересылка данных, знают как работать с потоками, и сокеты здесь не исключение. А упаковка в поток осуществляется уже по методам указанным выше. Конечно принципиально это не отличается от передачи обычного буфера, но при таком подходе вы получаете универсальность и отделяете котлет от мух.



Digitman   (2001-11-06 09:26) [7]

type
TMyEnum = (meOne, meTwo, meThree, meFour);

TMyStruc = packed record
F1: Integer;
F2: Double;
F3: String[255];
F4: TMyEnum;
end;
PMyStruc = ^TMyStruc;

var
MyStruc : TMyStruc;
MyStrucPtr : PMyStruc;

...
MyStrucPtr := @MyStruc;
...
ClientSocket.Socket.SendBuf(MyStruc, SizeOf(TMyStruc));
или
ClientSocket.Socket.SendBuf(MyStrucPtr^, SizeOf(TMyStruc));
или
ClientSocket.Socket.SendBuf(@MyStruc, SizeOf(TMyStruc));

выбирай на вкус)



panov   (2001-11-06 09:47) [8]

>evgen_2001
По поводу предыдущего примера:
Обрати внимание на строку
F3: String[255];

Если будешь определять просто как F3: String;,
то размер SizeOf(TMyStruc) будет определяться неверно.



Anatoly Podgoretsky   (2001-11-06 11:21) [9]

Будет определяться верно, но результат будет далек от нужного :-)
Правда тоже не беда, просто изменить алгоритм передачи данных
структура, длина, данные ...




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.021 c
14-90355          limon                 2001-12-03 18:31  2002.01.28  
Пример диалога со службой технической поддержки


4-90420           Alex870               2001-11-28 22:48  2002.01.28  
Неужели никто не знает...


7-90389           VL                    2001-10-16 13:42  2002.01.28  
Вопрос по mount для виндов...


1-90261           Delphimun             2002-01-07 11:55  2002.01.28  
Как найти далее при помощи pos?


3-90187           AlexOb                2001-12-22 15:56  2002.01.28  
Проблема с суммированием более 12 баз данных :(