Russian Qt Forum

Qt => Работа с сетью => Тема начата: V1KT0P от Март 19, 2012, 21:21



Название: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 19, 2012, 21:21
Сразу скажу что я глядел на qt_echo_server, но там слишком много кода для того чтоб я смог сразу разобраться. Да и asio я только начал изучать.
Так вот несколько вопросов:
1. Как проще всего установить связь между Qt и asio?
2. Могу ли я добавлять задания для asio из разных потоков, потокобезопасно ли это?
3. Как из asio вызвать сигналы Qt так, чтобы сигнал объекта выполнялся в том потоке к которому принадлежит объект?
4. Забить на симбиоз и делать GUI и сервер отдельными приложениями? С одной стороны вроде хорошо, с другой стороны добавлять прослойку межпроцессорного взаимодействия не хочется.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: BRE от Март 19, 2012, 21:24
4. Забить на симбиоз и делать GUI и сервер отдельными приложениями?
Вот только так. Не нужны серверы с гуями, не должно быть на аппаратных серверах гуев.

А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 19, 2012, 21:46
А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang.
Все твердят что типа серверы на erlang получаются идеальные. Но мне его вообще не хочется изучать.
Я хочу еще изучить Java, Ruby, Python и мелочь вроде JavaScript и Lua.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 21, 2012, 17:11
А asio хорош, да. Правильный выбор.
Я так понял ты знаешь asio, как установить timeout на асинхронный сокет?


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: BRE от Март 21, 2012, 17:31
Я так понял ты знаешь asio, как установить timeout на асинхронный сокет?
Я использую таймер (asio::deadline_timer).


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 21, 2012, 17:40
Я так понял ты знаешь asio, как установить timeout на асинхронный сокет?
Я использую таймер (asio::deadline_timer).
Смотри, я использую стандартные вызовы:
Код
C++ (Qt)
socket_.async_read_some(boost::asio::buffer(buffer_),
   strand_.wrap(
     boost::bind(&connection::handle_read, shared_from_this(),
       boost::asio::placeholders::error,
       boost::asio::placeholders::bytes_transferred)));
boost::asio::async_write(socket_, reply_.to_buffers(),
   strand_.wrap(
     boost::bind(&connection::handle_write, shared_from_this(),
       boost::asio::placeholders::error)));
Как мне по событию таймера отменить эти задания?


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: BRE от Март 21, 2012, 17:48
Как мне по событию таймера отменить эти задания?
Сказать сокету shutdown. Это приведет к срабатыванию всех активных обработчиков с кодом ошибки.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 21, 2012, 18:04
Как мне по событию таймера отменить эти задания?
Сказать сокету shutdown. Это приведет к срабатыванию всех активных обработчиков с кодом ошибки.

Спасибо, действительно работает.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: Barmaglodd от Март 23, 2012, 09:52

А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang.

asio-ужас на шаблонах, месяц пытался его освоить, но не смог до конца, хотя с остальными частями буста несколько лет работаю.
А Erlang да, хорош! После asio переделал всё за несколько дней на него.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 23, 2012, 11:55

А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang.

asio-ужас на шаблонах, месяц пытался его освоить, но не смог до конца, хотя с остальными частями буста несколько лет работаю.
А Erlang да, хорош! После asio переделал всё за несколько дней на него.
А по производительности как? Выросла или упала?


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: Barmaglodd от Март 23, 2012, 16:19
Хз, у меня больше 200 клиентов никогда не было, ощутимой нагрузки они не создают. Да и сравнивать сложно, Erlang вариант далеко ущёл от прототипа на asio.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 23, 2012, 16:23
Хз, у меня больше 200 клиентов никогда не было, ощутимой нагрузки они не создают. Да и сравнивать сложно, Erlang вариант далеко ущёл от прототипа на asio.
Тю у меня сервер на Qt4 тянет 500 клиентов. Переписываю на asio только из-за того что необходимо тянуть 2500 клиентов.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 23, 2012, 18:03
Как мне по событию таймера отменить эти задания?
Сказать сокету shutdown. Это приведет к срабатыванию всех активных обработчиков с кодом ошибки.

Еще вопрос, какой аналог QDataStream есть в asio или boost? Необходимо иметь возможность указать порядок байт.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: BRE от Март 23, 2012, 18:13
Еще вопрос, какой аналог QDataStream есть в asio или boost? Необходимо иметь возможность указать порядок байт.
Не знаю такого.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 23, 2012, 18:20
Еще вопрос, какой аналог QDataStream есть в asio или boost? Необходимо иметь возможность указать порядок байт.
Не знаю такого.
А как тогда ты из буфера вытягиваешь данные с нужным порядком байт?
Может я что-то не так делаю:
1) Буфер у меня массив char(m_buffer), в asio передаю вот так:
Код
C++ (Qt)
m_socket.async_read_some(boost::asio::buffer(m_buffer+m_buffer_count, sizeof(m_buffer)-m_buffer_count),
                            m_strand.wrap(
                                boost::bind(&Connection::handleRead, shared_from_this(),
                                            boost::asio::placeholders::error,
                                            boost::asio::placeholders::bytes_transferred)));
Вытягиваю данные через memcpy, ибо не понял как по другому сделать.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: Barmaglodd от Март 23, 2012, 18:30
Тю у меня сервер на Qt4 тянет 500 клиентов. Переписываю на asio только из-за того что необходимо тянуть 2500 клиентов.
А точно ли asio даст эти 2000? Под профайлером смотрели где затык?
Плюс Эрланга в том, что код стал проще, понятней и короче. А разбирать двоичные протоколы на нём намного проще чем на C/C++, особенно когда в одном пакете смесь полей в BCD и чисел с разным порядком байт.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: BRE от Март 23, 2012, 18:44
А как тогда ты из буфера вытягиваешь данные с нужным порядком байт?
Есть готовые решения. Я пользовался библиотекой msgpack, есть решение от Google, еще что-то смотрел.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 23, 2012, 18:56
А как тогда ты из буфера вытягиваешь данные с нужным порядком байт?
Есть готовые решения. Я пользовался библиотекой msgpack, есть решение от Google, еще что-то смотрел.

Спасибо посмотрю. Но все-равно в asio что-то должно же быть, это же сетевая библиотека. Я глядел на классы с названием buffer и stream, все они какие-то стремные.
А пока остановился на побайтовом memcpy в обратную сторону, как временное решение пойдет.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: BRE от Март 23, 2012, 19:00
Спасибо посмотрю. Но все-равно в asio что-то должно же быть, это же сетевая библиотека. Я глядел на классы с названием buffer и stream, все они какие-то стремные.
А пока остановился на побайтовом memcpy в обратную сторону, как временное решение пойдет.
Для текстового протокола хватает std::string, а если хочешь бинарный можно посмотреть на boost-овскую Serialization. Но я не захотел на нее завязывать большой коммерческий проект, поэтому остановился на msgpack.



Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Март 23, 2012, 19:59
Спасибо посмотрю. Но все-равно в asio что-то должно же быть, это же сетевая библиотека. Я глядел на классы с названием buffer и stream, все они какие-то стремные.
А пока остановился на побайтовом memcpy в обратную сторону, как временное решение пойдет.
Для текстового протокола хватает std::string, а если хочешь бинарный можно посмотреть на boost-овскую Serialization. Но я не захотел на нее завязывать большой коммерческий проект, поэтому остановился на msgpack.
Протокол бинарный и мне нужна банальнейшая вещь: извлекать из потока примитивные типы(с возможностью выбрать порядок байт). boost-овский Serialization это как стрельба из пушки по воробьям.
Проще наверно самому написать. Я думал такая банальная вещь есть хотя бы в boost.


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Апрель 03, 2012, 10:29
Кто знает как назначить приоритет или поток strand-у. А то много мало-приоритетных задач иногда надолго вытесняют несколько очень приоритетных задач?


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: niXman от Апрель 20, 2012, 02:19
asio держит 200000 коннектов на 4ех сетевухах и 8ми рабочих потоках.
при этом, имею ~4800000 сообщений в две стороны в сумме в секунду.

для манипуляции порядком байт, есть boost.endian (http://svn.boost.org/svn/boost/sandbox/endian/libs/endian/doc/index.html). пока лежит в sandbox`е (http://svn.boost.org/svn/boost/sandbox/endian/).


Название: Re: Qt + boost::asio - простейший симбиоз
Отправлено: V1KT0P от Апрель 20, 2012, 09:32
asio держит 200000 коннектов на 4ех сетевухах и 8ми рабочих потоках.
при этом, имею ~4800000 сообщений в две стороны в сумме в секунду.

для манипуляции порядком байт, есть boost.endian (http://svn.boost.org/svn/boost/sandbox/endian/libs/endian/doc/index.html). пока лежит в sandbox`е (http://svn.boost.org/svn/boost/sandbox/endian/).

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