Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.006 c
1-24970
grigoriy99
2002-12-25 16:07
2003.01.09
ActiveX


1-24885
Alexander Vasjuk
2002-12-24 18:02
2003.01.09
RichEdit в ActiveX


14-25005
Snake2000
2002-12-18 16:47
2003.01.09
Помогите решить задачу


1-24895
бред
2002-12-25 19:46
2003.01.09
новый компонент ошибку дает


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





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