Название: 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).Код Как мне по событию таймера отменить эти задания? Название: 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. А Erlang да, хорош! После asio переделал всё за несколько дней на него. Название: Re: Qt + boost::asio - простейший симбиоз Отправлено: V1KT0P от Март 23, 2012, 11:55 А asio хорош, да. Правильный выбор. Еще я бы предложил посмотреть на erlang. А 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. Это приведет к срабатыванию всех активных обработчиков с кодом ошибки.Название: 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 передаю вот так: Код Вытягиваю данные через 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, еще что-то смотрел.А пока остановился на побайтовом memcpy в обратную сторону, как временное решение пойдет. Название: Re: Qt + boost::asio - простейший симбиоз Отправлено: BRE от Март 23, 2012, 19:00 Спасибо посмотрю. Но все-равно в asio что-то должно же быть, это же сетевая библиотека. Я глядел на классы с названием buffer и stream, все они какие-то стремные. Для текстового протокола хватает std::string, а если хочешь бинарный можно посмотреть на boost-овскую Serialization. Но я не захотел на нее завязывать большой коммерческий проект, поэтому остановился на msgpack.А пока остановился на побайтовом memcpy в обратную сторону, как временное решение пойдет. Название: Re: Qt + boost::asio - простейший симбиоз Отправлено: V1KT0P от Март 23, 2012, 19:59 Спасибо посмотрю. Но все-равно в asio что-то должно же быть, это же сетевая библиотека. Я глядел на классы с названием buffer и stream, все они какие-то стремные. Для текстового протокола хватает std::string, а если хочешь бинарный можно посмотреть на boost-овскую Serialization. Но я не захотел на нее завязывать большой коммерческий проект, поэтому остановился на msgpack.А пока остановился на побайтовом memcpy в обратную сторону, как временное решение пойдет. Проще наверно самому написать. Я думал такая банальная вещь есть хотя бы в 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/). |