Прием данных по сокету. Какие конвенции лучше? |
Здравствуйте, гость ( Вход | Регистрация )
Прием данных по сокету. Какие конвенции лучше? |
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 флагом о том, что это последний кусок - то Уровень приложения добавляет этот кусок в свой буфер и возвращает этот буфер приложению. Этот буфер и будет сообщением. Ведь нисколечки не сложно? Правда ведь? Можешь посмотреть тут , оч познавательная статья. Можешь адаптировать для себя например протокол X-Modem или еще что нить. Это если тебе нужна надежность!!! Сообщение отредактировал kuzulis - 8.12.2011, 12:21 |
|
|
Текстовая версия | Сейчас: 28.11.2024, 6:03 |