Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.09;
Скачать: CL | DM;

Вниз

Помогите передать несколько структур по сети чере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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
3-24813
SergADO
2002-12-17 09:56
2003.01.09
ADO и параметрический запрос


14-25022
Besa
2002-12-19 10:28
2003.01.09
Не убивайте!!! :) Нужна помощь!


14-25040
OlDemon
2002-12-20 07:12
2003.01.09
Сайт по VBA


1-24940
Def
2002-12-26 13:58
2003.01.09
Бегущая строка


14-25090
Anatoly Podgoretsky
2002-12-22 10:21
2003.01.09
Именинники 22 декабря