Название: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 30, 2015, 13:00 В общем тема говорит сама за себя. Имеется клиент серверное приложение в котором клиенты обрабатываются в отдельном потоке. Тестировал приложение на Windows и оно работало !!!!!!!
Перенес на Ubuntu и покатило ... :) ) не буду все проблемы перечислять, с ними разобрался осталась непонятка с принятием данных ! QTcpSocket упорно не хочет принимать данные в потоке от клиента, не приходит сигнал readyRead(): QTcpServer: Код: /* QTcpSocket: Код: /* Самое интересное что ее GUI вариант под Ubuntu принимает пакеты, а консольный не хочет принимать, хотя под Windows работают оба варианта Вычитал на форумах что эта проблема не у меня только, но четкого понятного решения не обнаружи посуму обращаюсь к своему любимому форуму ) Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 30, 2015, 14:04 Кажись потихоньку стал понимать проблемы вроде бы была в том что App -> X11 отсылал данные X Serer-у а он у меня на компе был выключен вот и не приходили пакеты ... щас буду бороться с этим
Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 30, 2015, 16:51 Отключил рабочий стол но проблема осталась, объект не получает сообщения readyRead() ???
Есть догадки ? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Май 30, 2015, 17:54 хз, меня лично напрягает и название темы и содержимое :) Тема заезжена, у многих проблема та же. Хотя у всех всё нормально работает :)
А вы сначала поймите что не работает - ваш поток, tcp сокет или же ваш код (грешу на код). Вы не привели всего кода, за кадром остались самые важные части :) PS вы хоть в курсе, у вас сокеты создаются нормально или нет? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 30, 2015, 18:26 хз, меня лично напрягает и название темы и содержимое :) Тема заезжена, у многих проблема та же. Хотя у всех всё нормально работает :) А вы сначала поймите что не работает - ваш поток, tcp сокет или же ваш код (грешу на код). Вы не привели всего кода, за кадром остались самые важные части :) PS вы хоть в курсе, у вас сокеты создаются нормально или нет? Я же в первом посте написал, что приложение рабочее и под Виндой открывает потоки и работает нормально ! В Ubuntu тоже нормально но когда с графической частью, в консольном варианте не работает ... ??? Какой вам еще код привести там очень много ветки не хватит, я привел куски открытия потока и создания сокета ... Вот пример консольной вставки: Код: /* Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 30, 2015, 19:23 В качестве переключателя использую следующую конструкцию:
Код: // Checking if we need console application Возможно проблема в QCoreApplication, ведь когда запускаю в графической режиме то readyRead() приходит, а при заданнии параметров для консольного старта - не приходит ??????? Есть мысди по сему вопросу ? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Май 30, 2015, 19:38 Вы б ещё код окна привели.
Как бы вы спрашиваете - почему не приходит сигнал. А я и задаю вам вопрос - а вы уверены что у вас поток работает, что сокет нормально создаётся, что ваш сервер отвечает на запрос? Я задаю вопрос про работу всего этого под линуксом. Может вы где в переменной создания сокета ошиблись, и он у вас выдаёт ошибку? Может у вас поток намертво блочится под линусом, из-за какого то вашего кода? И вы на эти вопросы ещё сами себе не ответили, раз так вопрос поставлен :) PS делаете минимально рабочий пример и проверяете - работает или нет. Если работает - стучите себе по голову и ищете ошибку в коде. Если не работает - выкладываете на форум весь проект в архиве с cpp h qrc pro pri файлами в архиве. Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 30, 2015, 19:48 Вы б ещё код окна привели. Как бы вы спрашиваете - почему не приходит сигнал. А я и задаю вам вопрос - а вы уверены что у вас поток работает, что сокет нормально создаётся, что ваш сервер отвечает на запрос? Я задаю вопрос про работу всего этого под линуксом. Может вы где в переменной создания сокета ошиблись, и он у вас выдаёт ошибку? Может у вас поток намертво блочится под линусом, из-за какого то вашего кода? И вы на эти вопросы ещё сами себе не ответили, раз так вопрос поставлен :) PS делаете минимально рабочий пример и проверяете - работает или нет. Если работает - стучите себе по голову и ищете ошибку в коде. Если не работает - выкладываете на форум весь проект в архиве с cpp h qrc pro pri файлами в архиве. Я же уже привел все необходимые куски с connect(...) ???????? И смысл стого что я вышлю проект у вас нету специализированного железа для работы с ним, там сервер с собственным протоколом ????? Сильно вам поможет то что я вышлю проект, а вы скажите проект не рабочий стучите по голове ... зачем ?! Выслать то я могу но нужен ваш IP для подключения железа для работы к вашей машине ???? Вот тут у чувака подобная ситуация, но он в графике запустил ... у меня в графике тоже работает ... ему там не помогли: https://www.linux.org.ru/forum/development/7751902 Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Май 30, 2015, 20:04 *зануда мод он*
1) не надо мне ваш проект целиком, я просил лишь минимально компиляберный пример ОШИБКИ. Т.е. минимально компиляберный пример проекта, который принимает соединение (ЛЮБОЕ, ведь у вас это не работает, так?) и при этом выдаёт ошибку/не работает. 2) проверьте, посылает ли сервер пакет. 3) проверьте, работают ли сигналы в консольной версии. 4) напишите наконец версию ubuntu, в которой у вас проблема. 5) после всего этого соберитесь, возьмите себя в руки и по пунктам напишите ответ. *зануда мод офф* Вы показываете код, он не содержит ошибок на взгляд. Но система сигнал слотов зависима от того, что происходит у вас внутри, там, в программе. А не в методе, где просто происходит connect. Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 30, 2015, 20:12 *зануда мод он* 1) не надо мне ваш проект целиком, я просил лишь минимально компиляберный пример ОШИБКИ. Т.е. минимально компиляберный пример проекта, который принимает соединение (ЛЮБОЕ, ведь у вас это не работает, так?) и при этом выдаёт ошибку/не работает. 2) проверьте, посылает ли сервер пакет. 3) проверьте, работают ли сигналы в консольной версии. 4) напишите наконец версию ubuntu, в которой у вас проблема. 5) после всего этого соберитесь, возьмите себя в руки и по пунктам напишите ответ. *зануда мод офф* Вы показываете код, он не содержит ошибок на взгляд. Но система сигнал слотов зависима от того, что происходит у вас внутри, там, в программе. А не в методе, где просто происходит connect. *зануда мод он* *зануда мод офф* Оценил, смешно ) Ошибку не выдает, просто не принимает данные, но поработав раздупляется и начинает принимать, а потом опять ... Щас скину минимально рабочий )) Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Nidxogg от Май 30, 2015, 20:27 Может данные не доходят?
Недавно столкнулись с проблемой потери пакетов в маршрутизаторе Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Май 30, 2015, 21:08 До человека не доходит что лишь по шагово отсекая проблему, можно её локализовать, а потом и решить.
И ему пытаются помочь, а он смеется (не осуждаю), но и не отвечает на прямо заданные вопросы. А так как раздупляется, скорее всего напакостничали в коде. Или очередь забивают, или ещё что :) to Nidxogg: раз на винде всё работает, следовательно с сетью всё в порядке. Проблема в программе. Точнее в коде. И тут коронная фраза: "95% ошибки в вашем коде, 2% ошибок в ОС, 2% железные проблемы, 1% вина разработчиков Qt" :D Название: GSM VoIP Gateways Отправлено: iptOt от Май 31, 2015, 03:46 Четырехканальный GSM VoIP шлюз <a href=http://ecrimea.net/voip/gsm-voip-shlyuz-goip-4.html>GoIP 4</a> от компании HyberTone Technology Co., Ltd является новой моделью <a href=http://ecrimea.net/voip/gsm-voip-shlyuz-goip-4.html>VoIP GSM</a> шлюза на базе популярных и недорогих моделей GSM шлюзов GoIP. VoIP GSM gateway GoIP4 совершает звонки между GSM и IP сетями без выхода в телефонную сеть общественного пользования ТфОП, благодаря чему снижаются затраты на телефонную связь в т.ч. и на роуминг. Каждый из четырех GSM каналов VoIP GSM шлюза может работать независимо или в рамках единого логического канала (группы GSM каналов).
<a href=http://tritel.net.ru>Интернет в Симферополе</a> Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 11:03 До человека не доходит что лишь по шагово отсекая проблему, можно её локализовать, а потом и решить. И ему пытаются помочь, а он смеется (не осуждаю), но и не отвечает на прямо заданные вопросы. А так как раздупляется, скорее всего напакостничали в коде. Или очередь забивают, или ещё что :) to Nidxogg: раз на винде всё работает, следовательно с сетью всё в порядке. Проблема в программе. Точнее в коде. И тут коронная фраза: "95% ошибки в вашем коде, 2% ошибок в ОС, 2% железные проблемы, 1% вина разработчиков Qt" :D Во-первых не смеюсь, а меня это улыбает ) Это разные вещи ! А дальше по пунктам: 1) не надо мне ваш проект целиком, я просил лишь минимально компиляберный пример ОШИБКИ. Т.е. минимально компиляберный пример проекта, который принимает соединение (ЛЮБОЕ, ведь у вас это не работает, так?) и при этом выдаёт ошибку/не работает: Еще раз ошибку не выдает !!!!! А просто не получает данные, а постояв, потупив начинает получать данные ... нестабильно, в одной сессии получает, в другой нет, это как-то связано с потоками в консоли и классом QCoreApplication, ведь в графическом виде я создаю приложение QApplication и при запуске его под той же версией Ubuntu все работает, не работает только консольная версия и только на Ubuntu, в Windows работает. Получать начинает как мне кажется когда запускаю Putty в режиме X11-перенаправление. Щас зроблю мин-компилябити ! 2) проверьте, посылает ли сервер пакет: Еще раз не сервер посылает пакет, а клиент и это сервер не принимает данные в консоли на Ubuntu. Клиент - специализироанное железо ! 3) проверьте, работают ли сигналы в консольной версии: Сигналы работаю так как в классе Server: Код: connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newclient())); И соединение все время открывается но не принимает байты, причем вообще не принимает, я уже опрос буфера по таймеру сделал, но там все равно пусто: Код: /* 4) напишите наконец версию Ubuntu, в которой у вас проблема: Ubuntu 12.04.5 LTS 5) после всего этого соберитесь, возьмите себя в руки и по пунктам напишите ответ: Собрася, взял в руки. :D Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 11:50 Вот мин-компилябиляти, посмотрим что скажут проффесионалы ):
http://files.d-lan.dp.ua/download.php?file=0828716e7734c1c039c62fc1ce3a839f Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Old от Май 31, 2015, 12:29 Странно.
Я просто рас комментировал строку в SenseSystem::Client::process(): Код и слот socketReadClient при получении данных нормально вызывается. Archlinux. Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 13:25 Странно. Я просто рас комментировал строку в SenseSystem::Client::process(): Код и слот socketReadClient при получении данных нормально вызывается. Archlinux. О извеняюсь, она и должна была быть раскоментирована, это я просто когда экспериментировал с таймером чтения .. но это все равно не решает проблему, я же писал в графике работает а в консоли не работает ??????*? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Old от Май 31, 2015, 13:31 но это все равно не решает проблему, я же писал в графике работает а в консоли не работает ??????*? Я при запуске указываю в командной строек --view=console, все равно работает.Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 13:33 но это все равно не решает проблему, я же писал в графике работает а в консоли не работает ??????*? Я при запуске указываю в командной строек --view=console, все равно работает.Под Ubuntu ? Можно тогда версию ? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Old от Май 31, 2015, 13:36 Под Ubuntu ? Можно тогда версию ? Под арчем.Я это к тому, что скорее всего Qt здесь не причем, а виновата убунта. Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 13:40 Под Ubuntu ? Можно тогда версию ? Под арчем.Я это к тому, что скорее всего Qt здесь не причем, а виновата убунта. Та я понимаю, но как тогда починить ? Иногда прием сообщений приходит а потом нету ? От сессии к сесии ... И в графике на Ubuntu тоже работает !!!!! Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 14:49 Под Ubuntu ? Можно тогда версию ? Под арчем.Я это к тому, что скорее всего Qt здесь не причем, а виновата убунта. А может класс QCoreApplication блокировать поток ? Может можно его как-то конфигурировать ? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 16:06 Залил на git если кто боится надо:
https://github.com/redradist/Testing_Server.git Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 17:06 Сделал такую добавку и повалило ... Сообщение отлавиваются но ругается что нельзя передать сокет с родителем ...
Получается было да сокета с разными указателями, но одинаковыми дискрипторами и и все пакеты поступали в основной поток где был первоначальный сокет ... При передачи его во вторичный поток прием данных осуществляется. Код: /* Но как его создать во вторичном потоке и при этом отключить отлавливание событий в главном, или коректно переместить ????? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Май 31, 2015, 17:07 На более высокой версии убунту всё работает как часы. (точнее валится с сегфолтом после 6 подключений подряд, но эт уже косяк кода :D).
Как вариант сделать Client членом класса, отнаследованного от QThread и не париться. Хотя ситуация непонятная, что вы там натворили :D PS и да, лучше плюньте на ваши закоряки с потоками, сделайте нормально - сервер посылает/отправляет данные, а потоки лишь передают что отправить. PPS в одном из первых сообщений я и задавал вопрос по поводу успешности создания сокета :D Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 17:23 На более высокой версии убунту всё работает как часы. (точнее валится с сегфолтом после 6 подключений подряд, но эт уже косяк кода :D). Как вариант сделать Client членом класса, отнаследованного от QThread и не париться. Хотя ситуация непонятная, что вы там натворили :D PS и да, лучше плюньте на ваши закоряки с потоками, сделайте нормально - сервер посылает/отправляет данные, а потоки лишь передают что отправить. Что непонятного что наворотил, раньше передавал дискриптор классу Client, а теперь указатель на сокета. Тока как переместить сокет по человечески ? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Май 31, 2015, 17:49 Ну я б посоветовал поменять архитектуру :)
аля Client->Writer/Reader->Socket. Синхронизацией даже заниматься не нужно, всё разрулит сигнал слотовая система (чем и любима) :D Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 17:51 Ну я б посоветовал поменять архитектуру :) аля Client->Writer/Reader->Socket. Синхронизацией даже заниматься не нужно, всё разрулит сигнал слотовая система (чем и любима) :D Я об этом думал, но если бы сокет был в потоке приложение же теоретически быстрее работало бы ? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Old от Май 31, 2015, 18:31 Посмотрите на метод:
void QTcpServer::incomingConnection(qintptr socketDescriptor) и сделайте свою реализацию вместо метода newclient. Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Май 31, 2015, 20:00 Ну если честно, не вижу особой прибавки к быстродействию. Переключение потоков при большом количестве клиентов съест всю разницу :)
Хотя, как говорится это две стороны одной медали. И так и так можно, просто я ниразу не реализовывал принцип поток на клиент, ибо считаю избыточным. Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Май 31, 2015, 21:30 Ну если честно, не вижу особой прибавки к быстродействию. Переключение потоков при большом количестве клиентов съест всю разницу :) Хотя, как говорится это две стороны одной медали. И так и так можно, просто я ниразу не реализовывал принцип поток на клиент, ибо считаю избыточным. Ты предлагаешь в потоках разместить сокеты а клиентов в основном потоке ? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Июнь 01, 2015, 00:12 Да нет, предлагаю свести к
[Server] | [ передающий-принимающий поток ] | | | | | | | | | | | [client][client][client][client][client][client][client][client][client][client][client] Хотя тут ещё вопрос о количестве и качестве клиентов возникает и нужны подробности об обмене - объемы, интенсивность. В чём плюсы - фактически клиенты не будут знать ничего о том, как куда и в какой форме отправляются данные, вся прием передача в одном месте (т.е. логирование и отлов ошибок упрощается). Возможен контроль клиентов. Сколько упало, сколько подключено и далее. Эдакий шлюз. В чем минусы - один поток обрабатывает все данные. Ошибки и прочая валят весь приём передачу (ошибки программиста :D). Т.е. все клиенты будут зависеть от его работы. Вот тут вопрос об объемах встаёт. PS с другой стороны на очень быстрый обмен Qt не годится, Qt медленный по сути. Есть ещё вариант когда каждый клиент имеет свой сокет. Т.е. [ Server ] | | | | | | | [client-socket][client-socket][client-socket][client-socket][client-socket][client-socket][client-socket] Плюсы - каждый клиент независим, нет проблем влияющих на соседние клиенты. Минусы - Логирование затруднено. Отлов ошибок затруднён. Проблема с синхронизацией и обратной связью. Но в любом случае оба варианта живут дышат и работают. Вам выбирать :) Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Июнь 01, 2015, 00:31 Да нет, предлагаю свести к [Server] | [ передающий-принимающий поток ] | | | | | | | | | | | [client][client][client][client][client][client][client][client][client][client][client] Хотя тут ещё вопрос о количестве и качестве клиентов возникает и нужны подробности об обмене - объемы, интенсивность. В чём плюсы - фактически клиенты не будут знать ничего о том, как куда и в какой форме отправляются данные, вся прием передача в одном месте (т.е. логирование и отлов ошибок упрощается). Возможен контроль клиентов. Сколько упало, сколько подключено и далее. Эдакий шлюз. В чем минусы - один поток обрабатывает все данные. Ошибки и прочая валят весь приём передачу (ошибки программиста :D). Т.е. все клиенты будут зависеть от его работы. Вот тут вопрос об объемах встаёт. PS с другой стороны на очень быстрый обмен Qt не годится, Qt медленный по сути. Есть ещё вариант когда каждый клиент имеет свой сокет. Т.е. [ Server ] | | | | | | | [client-socket][client-socket][client-socket][client-socket][client-socket][client-socket][client-socket] Плюсы - каждый клиент независим, нет проблем влияющих на соседние клиенты. Минусы - Логирование затруднено. Отлов ошибок затруднён. Проблема с синхронизацией и обратной связью. Но в любом случае оба варианта живут дышат и работают. Вам выбирать :) Я реализовал второй вариант ) Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Июнь 01, 2015, 00:40 Работает? Ну и ладненько. Темку прикройте :)
Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Июнь 01, 2015, 11:42 Блин, не совсем сделал ... сделать то сделал, но опять в Ubuntu под консолью не работает:
Обработка нового клиента Код: /* Перемещаю Код: QThread *thread = new QThread(this); Опять теже грабли, под Виндой и консольный вариант работает, а в Ubuntu отправка данных с потока происходит, а вот приема данных нету ?????? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Июнь 01, 2015, 11:50 Мы уже выяснили что всё работает) А что там у вас в коде - хто вас знает :)
Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Денис от Июнь 01, 2015, 12:07 Мы уже выяснили что всё работает) А что там у вас в коде - хто вас знает :) Да причем тут у меня в коде, код рабочий и работает как в консоли на Windows, так и в графике, не работает только в консоли ... !!!!!! Вот у Old мой код работает и в консоли под ArchLinux, а у меня нет ... может Linux библиотека каких-то не хватает ? Название: Re: QTcpSocket заезжанная тема !!!!!!!!!! Отправлено: Bepec от Июнь 01, 2015, 12:31 И у меня всё работает. И у вас всё работает. Когда раздупляется.
Значит вы в коде его задупляете. Да, хотел сказать, но подзабыл - минимально компилябельный пример, это пример в котором есть: а) проблема. б) ничего больше. Сделайте такой проектик, без своих хитровыдуманных систем и потестируйте его в консольно-видовом режиме. PS то, что не работает Qt в Ubuntu, больше похоже на фарс. Потому что из 10 используемых мною программ на убунту, 8 написано на Qt :D |