• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Передача структурированного типа данных "запись" по локально

  • Автор темы DimonSoft
  • Дата начала
D

DimonSoft

Всем доброго времени суток!
При написании игры с сетевой поддержкой столкнулся с необходимостью передать данные типа RECORD (либо массив записей). Для работы с сетью использую компоненты TServerSocket и TClientSocket.
Может кто-нибудь подскажет как передать подобную структуру целиком:

[codebox]Rec = record
Name: string;
Point: word;
X, Y: integer;
end;[/codebox]

и принять ее. :)

Книги и поиск в интернете результатов не дал.

Всем заранее благодарен за помощь!
 
D

DimonSoft

Неужели никто не знает как это сделать?!
Я пробовал передавать процедурами SendBuf/ReceiveBuf, но такая передача работает очень нестабильно.
 
S

SoCi0pAt

для обмена данными по сети я использовал компоненты indy. запись частями загонял частями в memorystream, сначала отправлял размер потока памяти, а потом и сам поток. работало как часы, но размер передаваемых данных бел не особо велик. полагаю, в твоем случае схема действий не особо должна отличаться. ;)
 
Z

zubr

Тут проблема в использовании типа string в структуре. Дело в том, что string по большому счету - это адрес в памяти, а смысл передавать адрес строки находящейся на другом компе, даже нет смысла, передавать адрес в другой процесс.
Как вариант можно использовать вместо string - string[255]
 
S

SoCi0pAt

не вижу проблем с строками любой длины. зачем "утяжелять" передачу? может у него в строках по 3-5 символов?

Код:
i:=length(str);
MemStrm.Write(i,SizeOf(i));				  //пишем в поток длину строки
MemStrm.WriteBuffer(PChar(str)^,i);	//пишем саму строку

на стороне приема в том же порядке извлекаем из потока

З.Ы.: Тема старенькая ;) автару уже давно пофиг
 
D

DimonSoft

Программа конечно уже давно дописана. Правда пришлось обойтись без структуры.

З.Ы.: Тема старенькая laugh.gif автару уже давно пофиг

Хоть и старенькая, а учиться никогда не поздно. Так что спасибо за ответы. В другой раз буду знать как реализовывать подобную передачу информации.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!