LINUX.ORG.RU

Протокол поверх сокетов...

 , ,


0

5

Существует ли некий протокол поверх сокетов (в частности кутэшных), который бы разбивал сообщения на фрагменты и прозрачно склеивал. Чтобы переслать мегабайт можно было без проблем.

Я может не туда смотрел, но когда я слал больше ~64КБайт пакеты, то было как-то не айс. Может ошибаюсь, проясните плиз.

И поэтому я навелосипедировал свой протокольчик с фрагментами и т.п., но он не очень оптимален. Так мне бы готовое что-то.

При работе с TCP у тебя вообще нет пакетов, на том уровне, на котором ты с ним взаимодействуешь. У тебя есть поток данных, в котором надо расставлять метки, что сообщеие началось и закончилось.

P.S. Готового не встречал, если что-нибудь в итоге найдется - кастаните меня в тему.

trex6 ★★★★★ ()
Ответ на: комментарий от beastie

ну я и использую QTcpSocket, посмотри что trex6 написал - ты не уловил суть проблемы

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от trex6

Вот и мне тоже не удалось найти готового, хотя казалось бы, такая штука должна существовать.

I-Love-Microsoft ★★★★★ ()

Я может не туда смотрел, но когда я слал больше ~64КБайт пакеты, то было как-то не айс. Может ошибаюсь, проясните плиз.

Если ты использовал TCP, то по-любому где-то накосячил.

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

т.е. ты настаиваешь, что я могу послать через QTcpSocket тупо QByteArray размером 1 мегабайт и всё дойдет? Я хочу удостовериться что я по неопытности тупанул и сейчас в заблуждении.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от yoghurt

ProTip(TM): не забывать проверять возвращаемое значение QIODevice::write()

yoghurt ★★★★★ ()
Ответ на: комментарий от oh-la-la

Очень хочу SCTP и давно на него слюни текут, но ты скажи мне - с виндой связь будет? Ведь это не только от софта зависит, но еще и ОС? Мне надо чтобы и с виндой была связь, увы. Хотя, надо подумать, кажется в системе не будет винды...

Но на всякий случай проясни этот момент, плиз.

I-Love-Microsoft ★★★★★ ()

Сначала указываешь длину сообщения (пусть это будет 4 байта в little-endian, например), потом пишешь данные нужного размера.

На клиенте ждешь первые 4 байта, читаешь их, дальше ты знаешь размер — сколько тебе необходимо считать.

Ну и обработка ошибок, куда без неё. Проверяешь write/read, и т.д.

Вообще для этого и создают протоколы прикладного уровня.

Chaser_Andrey ★★★★★ ()

Мне понравился протокол WebSocket (кроме handshake и mask-key). Можешь даже его заюзать.

Chaser_Andrey ★★★★★ ()
Последнее исправление: Chaser_Andrey (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Из коробки нет. Есть сторонний драйвер SctpDrv. Должно работать, но я не проверял.

oh-la-la ()

Ты придумал, как ты будешь отличать одно сообщение от другого? Особенно, где бинарные данные.

Chaser_Andrey ★★★★★ ()

Когда я еще писал под шиндовс (на сокетах), я передавал файл кусками. Условно - сделал свой протокол (для своего же клиента и сервера). И как тут уже сказали - ставил метки, а-ля «файл еще не закончился». Когда приходило «файл передан полностью», то закрывал операцию передачи и выводил что-то там или сохранял файл (да, дурак, держал в памяти, не сразу писал на диск).

coderage ()

Thrift, Google Protobuf. Первый даже сервер включает. Второй зато няшный

vertexua ★★★★★ ()

Феерия

Разбей на куски, каждому присвой порядковый номер, передавай размер+номер+кусок. По прибытию склеивай. А-ля торренты. В чём проблема-то?

schizoid ★★★ ()
Ответ на: комментарий от Chaser_Andrey

Плюсую. Самое простое и адекватное решение.

staseg ★★★★★ ()
Ответ на: комментарий от oh-la-la

Когда говорят «поверх сокетов», то подразумевается обычно именно поверх TCP/UDP, а не на одном уровне с ними поверх IP. Но о терминологии можно спорить долго. По крайней мере ТСу скорее всего хватило бы чего-то поверх TCP с головой

vertexua ★★★★★ ()
Ответ на: комментарий от schizoid

Вообще эти уже TCP занимается. Зачем второй раз одну и ту же работу делать?

trex6 ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Наверняка должно быть что-то. Мне это уже давно не нужно, поэтому я не в теме. Другой вопрос, что по логике - если клиент-сервер твой собственный, то тебе все равно придется встраивать чужую либу туда, и еще не факт что проще, самому написать или встроить чужую.

coderage ()

было как-то не айс.

Мне определенно нравятся такие описания технических проблем..

svu ★★★★★ ()
Ответ на: комментарий от schizoid

Ты шлешь гигабайт, порт открыт один, и вдруг надо во время этого два байта переслать???

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от Pavval

Мне надо чтобы я мог асинхронно совать в сокет данные любого размера и принимать. И при этом чтобы параллельно несколько потоков шло. Вроде STCP но поверх обычных сокетов.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Ну сделай сегментацию свою, а лучше заюзай какую-нибудь либу для websockets, например (там это из коробки)

mannaz ()

я использую для подобного ZeroMQ с оберткой nzmqt

HighwayStar ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Есть несколько реализаций SCTP под оффтопик, но живых там вроде как нет => нет и соответствия стандарту. PS. SCTP херово NAT'ится => его лучше использовать либо на ipv6, либо на реальнике.

greek_31 ★★ ()

Весь этот тред, это смех какой-то. I-Love-Mircosoft, будь мужиком, сделай все через TCP и не позорься. Не нужен тебе для этого никакой SCTP.

pathfinder ★★★★ ()
Ответ на: комментарий от pathfinder

У меня уже давно сделано, спасибо родной за беспокойство :)

Просто думал что есть готовые реализации этого, и всё. Пробовал ZeroMQ и многое другое - работает, но увы, не так как хочется.

I-Love-Microsoft ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.