Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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]

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



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

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

Наверх




Память: 0.46 MB
Время: 0.004 c
3-90219
Oleg_K
2001-12-17 21:03
2002.01.28
DBEdit в фокусе


14-90365
Владислав
2001-12-03 08:55
2002.01.28
Недокументированные возможности Delphi 5.


3-90215
Алекс С.
2001-12-22 15:00
2002.01.28
LookupField


1-90281
Leva
2002-01-10 12:36
2002.01.28
StayOnTop-форма исчезает


1-90263
Tosov
2002-01-08 23:22
2002.01.28
Закраска ячейки StringGrid





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