Форум: "Сети";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
ВнизПомогите передать несколько структур по сети череp Сокеты Найти похожие ветки
← →
Борис (2002-11-11 13:59) [0]Здравствуйте!
Такая проблема. Есть 2 приложения. Одно сервер, другое клиент.
Сервер после получения от клиента строчки "Hello" начинает ему передавать структуру (типа запись):
Form1.ServerSocket.Socket.Connections[0].SendBuf(struct,SizeOF(lppe));
Все замечательно передается и принимается сторонами.
А вот теперь необходимо передать две разные структуры, сначало одну, а потом сразу за ней вторую.
Как это сделать? Пробовал перед началом и после окончания отправки первой структуры передавать клиенту текстовые сообщения, а потом сразу слать вторую структуру, но не получается.
Заранее спасибо за помощь!
← →
Digitman (2002-11-11 14:11) [1]
> сначало одну, а потом сразу за ней вторую
Да на здоровье ! Хоть косой десяток подряд передавай ! Какие проблемы-то ?
Важно, чтобы принимающая сторона ожидала эти структуры именно в том порядке, в каком они отправляются передающей стороной.
Это и называется "протоколом информационного обмена" (ПИО).
Если заведомо определенного порядка ПИО не оговаривает, значит, в нем д.б. предусмотрены сигнатуры, предваряющие посылку/прием каждой отдельной структуры конкретного формата. Сигнатурой может быть и текст и некое числовое значение - здесь никто не ограничивает фантазию разработчика ПИО, лишь бы фигурировала осмысленная и аргументированная целесообразность выбора типа данных, являющих собой сигнатуру (равно как и типы данных, составляющих те или иные структуры в составе ПИО)
← →
Борис (2002-11-11 14:18) [2]to Digitman Большое спасибо за ответ!
Вы правы. Однако я не знаю, сколько "первых" обектов буду передавать.
Вот получаю я объекты так:
Socket.ReceiveBuf(lppe,sizeof(struct));
А камк мне знать, что сейчас уже передалась не структура, а строка? Никак не могу сообразить! Я-ж не могу после Socket.ReceiveBuf(lppe,sizeof(struct)); читать еще и text:=socket.ReceiveText;???
← →
Digitman (2002-11-11 14:34) [3]а строка-то - разве это не структура ?! точно такая же структура, как и любая другая !
предусмотри в своем ПИО сигнатурные числовые префиксы, посылаемые передатчиком и извещающие приемник о том, что следом за принятой им сингнатурой с таким-то конкретным значением последует передача такой-то конкретной структуры (или, если угодно, строки, передача которой предваряется посылкой полной ее длины)
Например,
-передатчик посылает байт со значением 1, следом - структуру TStruc1
-передатчик посылает байт со значением 2, следом - 4 байта со значением длины строки = 6, следом - саму строку "ABCDEF"
- приемник принимает байт, видит, что он = 1, значит, следом ему следует ожидать как минимум фрагмент данных с SizeOf(TStruc1)
- приемник принимает байт, видит, что он = 2, значит, далее следуют 4 байта длины (значение этих 4-х байт = 6 ему нужны для выделения памяти под следом принимаемую строку, например, SetLength), а далее следует прочитать 6 байт в буфер, распределенный под принимаемую строку
← →
Борис (2002-11-11 14:42) [4]Да, я так и хотел делать.
Но когда я посылаю например текст "Connect OK", а потом еще какую-то информацию, она вся при получении выстраивается в одну строчку!
← →
Digitman (2002-11-11 15:04) [5]значит, неправильно принимаешь !
принимать нужно ровно столько, сколько заявлено передатчиком в префиксе размера данных
← →
Борис (2002-11-11 15:05) [6]А как узнать сколько заявлено передатчиклм???
← →
Digitman (2002-11-11 15:09) [7]А ПИО на что ? Это ты должен ПИО определить ! Скажем, в соответствии с твоим ПИО, передача/прием всякой строки должны предваряться передачей/приемом, скажем, 4-х байт, являющих соболй Integer-данные, хранящие размер СЛЕДОМ передаваемой/принимаемой строки
← →
Борис (2002-11-11 17:16) [8]Digitman
Большое спасибо!
Моя ошибка была в том, что я отправлял и принимал соответственно строчку а потом структуру.
Сейчас я перед каждой отправкой структурыотправляю "байт" в котором говорю, что будет следующей структурой!
Огромное спасибо за то, что находите время отвечать на вопросы.
Удачи!
← →
Digitman (2002-11-11 17:20) [9]>Борис
Все верно - это и есть элементы протокола инф.обмена между клиентом и сервером !
Успехов !
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c