Russian Qt Forum
Ноябрь 22, 2024, 08:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как определить размер пакета HTTP?  (Прочитано 8210 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« : Октябрь 25, 2016, 11:35 »

Пишу реализацию websocked. Не могу понять - как определить размер http пакета.

для установления соединения по websocked клиент шлет http запрос на установление соединения. этот пакет выглядит примерно так
Код:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Origin: http://javascript.ru
Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q==
Sec-WebSocket-Version: 13

Сервер прослушивает tcp соединение. при получении данных сервер должен проанализировать полученные данные и обработать их. Пакет в сервер может прийти кусками. клиент может отправить 3 пакета. Допустим пакет на установление соединения 100 байт и два пакета по 50 байт. Сервер получит 10 байт, потом 20, потом ещё 170 байт. итого 200 байт (100 байт первого запроса, 50 байт второго и 50 байт третьего запроса/пакета от клиента). как серверу определить что первые 10 байт - это не полный пакет и надо ещё раз подождать.... следующие 20 байт - это тоже не полный пакет...... а потом ещё 170 байт - тут уже есть аж ТРИ пакета. нужно их все три обработать. Как делать определить размер пакета http?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 25, 2016, 11:38 »

Анализируй полученные данные, у http запросов есть спецификация.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #2 : Октябрь 25, 2016, 11:44 »

ну вот я и хочу написать анализатор. какая спецификация? как из потока данных выделить целые http пакеты?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Октябрь 25, 2016, 11:47 »

https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

Читать раздел Message Format.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #4 : Октябрь 25, 2016, 13:42 »

TCP протокол на себя берёт склейку/разбитие пакета. Т.е. если вы отправляете 100 байт, то на приемной стороне придет 100 байт.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #5 : Октябрь 25, 2016, 14:09 »

TCP протокол на себя берёт склейку/разбитие пакета. Т.е. если вы отправляете 100 байт, то на приемной стороне придет 100 байт.

не берёт. я отправляю два запроса подряд по 10 байт. на приемной стороне получаю сразу пакет в 20 байт и приходится самому понимать, где там границы двух пакетов, все ли данные пришли. 

ps в тпс, в отличии от udp,  вообще нет понятия "пакет". Там есть понятие поток. засунули с одной стороны 100 байт... с другой они могут прийти частями...... хоть 100 раз по 1 байту.

смотрим Сравнение UDP и TCP

у тсп "Потоковость — данные читаются как поток байтов, не передается никаких особых обозначений для границ сообщения или сегментов."
у юдп Датаграммы — пакеты посылаются по отдельности и проверяются на целостность только если они прибыли. Пакеты имеют определенные границы, которые соблюдаются после получения, то есть операция чтения на сокете-получателе выдаст сообщение таким, каким оно было изначально послано. у тсп такого нет.
Записан
Bepec
Гость
« Ответ #6 : Октябрь 25, 2016, 14:55 »

Не встречал таких проблем.
При посыле 10 байт мне приходит 10 байт. 20 - 20. 100-100.
С другой стороны я не работал с большим количеством данных, от 150 и выше.

PS у всех http пакетов в начале идет "команда" с указанием версии http. Вот по ним и режьте.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #7 : Октябрь 25, 2016, 15:06 »

При посыле 10 байт мне приходит 10 байт. 20 - 20. 100-100.
в 99.99% случаях так и будет работать. но послали 100 байт, на приемнике вызываете метод recv() у сокета тсп. Он вам вернет то кол-во байт, которое он получил по тсп на момент вызова recv(). Но ни кто не гарантирует что поток данных кончен и больше нет данных. Нужно самому проверять.  Многие на эту проверку ложат, думая, что тсп за них это делает. Но в узких каналах с большими задержками и большими массивами данных могут возникнуть фрагментации. нужно быть к ним готовым.

в хттп вроде как конец выделяется строкой "\r\n\r\n"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.