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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Передача XML по сети  (Прочитано 15497 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Август 08, 2011, 08:55 »

Как можно динамически формировать XML и передавать/принимать их по сети?
Желательно без QDataStream, так как клиент написан на Qt, а сервер на чистом Си под лины.
Задача, сформировать небольшой xml документ, отправить на сервер, сервер возвратит тоже небольшой xml док, после чего идёт обмен бинарными данными.
Записан
Странник
Гость
« Ответ #1 : Август 08, 2011, 15:05 »

способов вагон. я предпочитаю использовать QXmlStreamWriter. можно сначала сформировать документ в QByteArray-буфер и затем отправить его целиком через QTcpSocket, а можно сразу в QTcpSocket писать. подробности в документации на QXmlStreamWriter.
Записан
BigHom
Гость
« Ответ #2 : Ноябрь 06, 2012, 08:58 »

А как принимать xml-документ , как понять , что целиком принят документ , что больше не будет продолжения передачи? Так как приняв часть, обрабатывается только принятая часть, а послав продолжение , то так как нет началА XML-документа , то продолжение как xml-документ не воспринимается?!

Возможно же, передача по частям xml-документа , f не обязательно целиком?!
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 06, 2012, 10:21 »

xml - теговый. Если пришёл тег конца, значит передача xml закончена. Вроде всё просто.
Записан
BigHom
Гость
« Ответ #4 : Ноябрь 06, 2012, 10:26 »

пришёл файл по сети - даю на обработкку sax-анализатору, всё работает , идёт по веткам, но не доходит до тэга конца, так как ещё не поступил. Потом по сети приходит 2-й кусок - даю на обработку - но продолжение не воспринимается как xml-документ , так как нет тэга начала.
То есть получается , что sax-анализатору можно давать только целиковый xml-документ? Как продолжить обработку с прерванного места , есть ли возможность?
Записан
Sancho_s_rancho
Гость
« Ответ #5 : Ноябрь 06, 2012, 10:51 »

Не придумывайте трудностей. Шлите небольшие xml.
Записан
Patrin Andrey
Гость
« Ответ #6 : Ноябрь 06, 2012, 11:50 »

А небольшие это сколько? Кто даст гарантию, что "небольшой" не прилитит "маленькими" частями?
Записан
mutineer
Гость
« Ответ #7 : Ноябрь 06, 2012, 11:58 »

А небольшие это сколько? Кто даст гарантию, что "небольшой" не прилитит "маленькими" частями?

Передать перед документом его размер и не отдавать документ парсеру, пока он весь не придет
Записан
Bepec
Гость
« Ответ #8 : Ноябрь 06, 2012, 12:02 »

Зачем такие сложности? Принимать данные до тех пор, пока не примется завершающий тег xml. После отдаёшь парсеру и врубливаешь бинарные данные куда угодно.
Записан
mutineer
Гость
« Ответ #9 : Ноябрь 06, 2012, 12:03 »

То есть понять какой тег завершающий и дождаться его, это проще, чем тупо считать размер полученных данных?
Записан
Patrin Andrey
Гость
« Ответ #10 : Ноябрь 06, 2012, 12:10 »

А небольшие это сколько? Кто даст гарантию, что "небольшой" не прилитит "маленькими" частями?

Передать перед документом его размер и не отдавать документ парсеру, пока он весь не придет
Ну да. При таком подходе нет разницы "большой" документ или "небольшой". А на сколько я понял, передавать "небольшой" и предлагают для того, чтобы не передавать размер.
Записан
Bepec
Гость
« Ответ #11 : Ноябрь 06, 2012, 12:20 »

Помоему да, проще. Особенно с учётом того, что xml формируется им же.

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

Записан
Sancho_s_rancho
Гость
« Ответ #12 : Ноябрь 06, 2012, 15:33 »

1. Контролировать, что пришли все байтики должен протокол прикладного уровня(в простейшем случае сочините заголовок фиксированной длины в котором хранится инфа о размере xml данных). Причем это делать обязательно независимо от того, сколько байт или терабайт передается и что пересылается(xml или картинка с голой тетёй). Проще взять TCP, там уже есть гарантия доставки и отбрасывание повторяющихся пакетов. Если очень хочется, то можно хоть хеш каждого xml файла считать.
2. Небольшой размер xml я рекомендовал вместо загадочного частичного парсинга.
Записан
mutineer
Гость
« Ответ #13 : Ноябрь 06, 2012, 16:21 »

2. Небольшой размер xml я рекомендовал вместо загадочного частичного парсинга.

И какого размера должен быть этот xml, чтобы он гарантировано пришел одним куском?
Записан
Sancho_s_rancho
Гость
« Ответ #14 : Ноябрь 07, 2012, 08:56 »

2. Небольшой размер xml я рекомендовал вместо загадочного частичного парсинга.

И какого размера должен быть этот xml, чтобы он гарантировано пришел одним куском?
Я не знаю термина "один кусок". UDP пакет - это кусок? Так вот,  датаграмма для udp ТЕОРЕТИЧЕСКИ может достигать 65535 вычесть длину заголовка. Все зависит от сетевого стека ОС. На практике не один человек в здравом рассудке на это полагаться не будет.
Вот что пишут Qt-шники
Datagrams are always written as one block. The maximum size of a datagram is highly platform-dependent, but can be as low as 8192 bytes. If the datagram is too large, this function will return -1 and error() will return DatagramTooLargeError.

Sending datagrams larger than 512 bytes is in general disadvised, as even if they are sent successfully, they are likely to be fragmented by the IP layer before arriving at their final destination.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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