crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Прием данных по сокету. Какие конвенции лучше?
Andrewshkovskii
  опции профиля:
сообщение 8.12.2011, 11:03
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Есть клиент и сервер. Постоянно обмениваются сообщениями разной длинны.
Сейчас, что бы понять, где кончается одно сообщение и начинается другое, используется конвенция сообщений такая :
Цитата
%длина_всего_соообщения%|%тело сообщения%


Но с этим иногда бывают косяки. Есть ли какие-то ещё конвенции или парадигмы, как лучше общаться сокетам большими сообщениями?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
kuzulis
  опции профиля:
сообщение 8.12.2011, 12:17
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата
Есть ли какие-то ещё конвенции или парадигмы, как лучше общаться сокетам большими сообщениями?


man это и это

Обычно "парадигмы" это запрос/ответ или посылка/подтверждение.

Структуры кадров в общем случае выглядят: <header><body><trailer>

Где header, body, trailer - это поля кадра.

в header, например, могут указываться маркёры + биты направлений + биты типа пакета (первый/не первый/последний) + номер пакета + длина последующих данных body
в body собственно, данные.
в trailer, например, могут указываться маркёры + CRC

Если сообщение уж оч длинное, то можешь разбить свою "подпрограмму" обработки сообщений на два ISO/ISI уровня: грубо канальный + приложения.

Твое приложение будет принимать готовое здоровенное сообщение из уровня приложения и писать в уровень приложения.
Уровень приложения принимает от здоровенное сообщение от программы, дробит его на части, и отсылает канальному(или физическому - пофик как назовешь), который оборачивает в <header><body><trailer>
и шлет в сокет с обязательным ожиданием ACK от удаленной стороны.
И так до конца, пока Уровень приложения не передаст все части этого сообщения.

В обратку - канальный уровень из сокета принимает кусок данных как <header><body><trailer>, проверяет header, trailer . Если все ОК,
то он обрезает header, trailer, вынимает кусок body и передает его наверх в Уровень приложения. Если какая-то хрень с header, trailer,
то канальный уровень перезапрашивает этот кусок.
Уровень приложения принимает body от канального, и для уровня приложения этот же body будет выглядеть как <header2><body2><trailer2>
оно это проверяет, извлекает body2 и накапливает эти куски в своем буфере (добавляет каждый следующий кусок). И когда Уровень приложения
примет от канального <header2><body2><trailer2> с указанным в header2 флагом о том, что это последний кусок - то
Уровень приложения добавляет этот кусок в свой буфер и возвращает этот буфер приложению. Этот буфер и будет сообщением.

Ведь нисколечки не сложно? Правда ведь? :rolleyes:

Можешь посмотреть тут , оч познавательная статья.
Можешь адаптировать для себя например протокол X-Modem или еще что нить.

Это если тебе нужна надежность!!!

Сообщение отредактировал kuzulis - 8.12.2011, 12:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Andrewshkovskii   Прием данных по сокету. Какие конвенции лучше?   8.12.2011, 11:03
- - sidsukana   А чем тебя не устраивает обмениваться структурами?...   8.12.2011, 11:21
- - kuzulis   ЦитатаЕсть ли какие-то ещё конвенции или парадигмы...   8.12.2011, 12:17
|- - Andrewshkovskii   Цитата(kuzulis @ 8.12.2011, 12:17) Цитата...   8.12.2011, 14:05
- - ssoft   Цитата(Andrewshkovskii @ 8.12.2011, 12:03...   8.12.2011, 13:34
- - kuzulis   ЦитатаЯ вроде говорил о том, что над протоколом, а...   8.12.2011, 14:43
|- - Andrewshkovskii   Цитата(kuzulis @ 8.12.2011, 14:43) Цитата...   8.12.2011, 16:09
- - ssoft   Цитата(Andrewshkovskii @ 8.12.2011, 15:05...   8.12.2011, 15:43
- - Влад   Цитата(Andrewshkovskii @ 8.12.2011, 12:03...   9.12.2011, 15:45
|- - Andrewshkovskii   Цитата(Влад @ 9.12.2011, 15:45) Цитата(An...   9.12.2011, 16:26
- - Влад   Гмм. Что-то это из категории загадок.... :-) Во-п...   10.12.2011, 19:19
|- - Andrewshkovskii   Цитата(Влад @ 10.12.2011, 19:19) Гмм. Что...   10.12.2011, 22:42
|- - BRE   Цитата(Andrewshkovskii @ 10.12.2011, 23:4...   10.12.2011, 22:56
- - Andrewshkovskii   Т.е. , если я передаю файл, скажем, 1 гб, и где-то...   10.12.2011, 23:49
- - BRE   Если пакет теряется - стек будет просить его переп...   11.12.2011, 0:06
- - Влад   А если ты эту ошибку не обрабатываешь, то это баг ...   11.12.2011, 13:05
|- - BRE   Цитата(Влад @ 11.12.2011, 14:05) (С колле...   11.12.2011, 14:35
- - Andrewshkovskii   Сообщение перемещено Сюда   14.12.2011, 22:18


Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 6:03