![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача структуры по сокету [D5, NT4]
evgen_2001 © (2001-11-05 16:10:00)Помогите с сабжем!
Anatoly Podgoretsky (2001-11-06 11:21:00) [1]Будет определяться верно, но результат будет далек от нужного :-)
Правда тоже не беда, просто изменить алгоритм передачи данных
структура, длина, данные ...
panov (2001-11-06 09:47:00) [2]>evgen_2001
По поводу предыдущего примера:
Обрати внимание на строку
F3: String[255];
Если будешь определять просто как F3: String;,
то размер SizeOf(TMyStruc) будет определяться неверно.
Digitman (2001-11-06 09:26:00) [3]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));
выбирай на вкус)
Alien (2001-11-05 23:04:00) [4]Обычно такие задачи решаются путём реализации методов SaveToStream и LoadFromStream, которые принимают указатель на базовый класс TStream. Практически все компоненты, которым требуется пересылка данных, знают как работать с потоками, и сокеты здесь не исключение. А упаковка в поток осуществляется уже по методам указанным выше. Конечно принципиально это не отличается от передачи обычного буфера, но при таком подходе вы получаете универсальность и отделяете котлет от мух.
Anatoly Podgoretsky (2001-11-05 18:00:00) [5]panov © (05.11.01 16:42)
Конечно, ну и что, главное что бы с обоих концов использовали одинаковый метод упаковки структуры. Если же речь идет об платформон-независимом решении, то packed тем более недостаточно, надо дополнительно к нему использовать только фундаментальные типы.
Di_wind © (05.11.01 17:44)
Какая разница, а если это двоичные данные то и невозможно в принципе.
Di_wind (2001-11-05 17:44:00) [6]а почему не зацинуть структуры в строку? разделяя поля каким-либо знаком к примеру * а на выходе опять преобразвововать в структуру, помойму так можно, если я неправ прошу поправить....
panov (2001-11-05 16:42:00) [7]>Anatoly Podgoretsky
Но тогда ведь между полями могут быть "дырки" в памяти?
Anatoly Podgoretsky (2001-11-05 16:38:00) [8]packed не обязательно
panov (2001-11-05 16:34:00) [9]Как правило, в любых компонентах(из сокетных) есть метод Send, позволяющий передавать непрерывный буфер данных.
Если использовать packed record, то запись у тебя будет располагаться в непрерывном участке памяти.
Останется посчитать длину этой записи(как сумму длин всех полей).