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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QTcpSocket заезжанная тема !!!!!!!!!!  (Прочитано 20063 раз)
Денис
Гость
« : Май 30, 2015, 13:00 »

В общем тема  говорит сама за себя. Имеется клиент серверное приложение в котором клиенты обрабатываются в отдельном потоке. Тестировал приложение на Windows и оно работало !!!!!!!
Перенес на Ubuntu и покатило ...  Улыбающийся ) не буду все проблемы перечислять, с ними разобрался осталась непонятка с принятием данных !
QTcpSocket упорно не хочет принимать данные в потоке от клиента, не приходит сигнал readyRead():

QTcpServer:
Код:
/*
 * New client connection
 */
void SenseSystem::TechServer::newclient()
{
    // If server started
    qDebug() << QString::fromUtf8("New connection!!!");

    qintptr IDSocket = tcpServer->nextPendingConnection()->socketDescriptor();

    QThread *thread = new QThread();
    Client *client = new Client(IDSocket);
    client->moveToThread(thread);
    // Соединяем сигнал started потока, со слотом process "рабочего" класса, т.е. начинается выполнение нужной работы.
    connect(thread,SIGNAL(started()),client,SLOT(process()));
    connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
    // По завершению выходим из потока, и удаляем рабочий класс
    connect(client,SIGNAL(finished()),thread,SLOT(quit()));
    connect(client,SIGNAL(finished()),client,SLOT(deleteLater()));
    // Удаляем поток, после выполнения операции
    if(config.typeView == CONSOLE)
    {
        connect(client,SIGNAL(println(QString)),(Console *)config.display,SLOT(outStream(QString)));
        connect(client,SIGNAL(addClientToList(int)),(Console *)config.display,SLOT(addClientToList(int)));
    }
    else if(config.typeView == WINDOW)
    {
        connect(client,SIGNAL(println(QString)),((MainWindow *)config.display),SLOT(outStream(QString)));
        connect(client,SIGNAL(addClientToList(int)),(MainWindow *)config.display,SLOT(addClientToList(int)));
    }
    connect(client,SIGNAL(removeClientFromList(int)),this,SLOT(removeMap(int)));

    SenseSystem::TechServer::client.insert(IDSocket,client);
    thread->start();
}

QTcpSocket:
Код:
/*
 * Run the thread
 */
void SenseSystem::Client::process(void)
{
    clientSocket = new QTcpSocket();
    // Trying to connect to socket descriptor
    if (!clientSocket->setSocketDescriptor(socketDescriptor))
    {
        // Can't connect to socket descriptor
        finished();
    }
    else
    {
        sql = new MainSQL("localhost","postirayka",
                          "root","root");

        // Initiolization settings for system
        timer = new QTimer(this);
        // setup signal and slot
        connect(timer,SIGNAL(timeout()),this,SLOT(readCommand()));
        // Reading command from MySQL
        timer->start(2000);

        // Initiolization settings for system
        autoriz = new QTimer(this);
        // setup signal and slot
        connect(autoriz,SIGNAL(timeout()),this,SLOT(finishThread()));
        // Reading command from MySQL
        autoriz->start(20000);

        // Initiolization settings for system
        timAlive = new QTimer(this);
        // setup signal and slot
        connect(timAlive,SIGNAL(timeout()),this,SLOT(finishThread()));
        // Reading command from MySQL
        timAlive->start(600000);

        timModem = new QTimer(this);
        // setup signal and slot
        connect(timModem,SIGNAL(timeout()),this,SLOT(readModem()));
        // Reading command from MySQL
        timModem->start(50000);

        timBufClear = new QTimer(this);
        // setup signal and slot
        connect(timBufClear,SIGNAL(timeout()),this,SLOT(bufferClear()));

        // Starting the thread of socket to execute events
        connect(clientSocket,SIGNAL(readyRead()),this, SLOT(socketReadClient()));
        connect(clientSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this, SLOT(clientChangeState()));
        connect(clientSocket,SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(socketErrorClient()));
        connect(clientSocket,SIGNAL(disconnected()),this, SLOT(socketRemoveClient()));

        // String to window
        QString strSocket;
        strSocket += QString("[") + QString::number(socketDescriptor) + "] New connection!!!" + "\r\n\r\n";
        // Set text to the text browser
        println(strSocket);
    }
}

Самое интересное что ее GUI вариант под Ubuntu принимает пакеты, а консольный не хочет принимать, хотя под Windows работают оба варианта

Вычитал на форумах что эта проблема не у меня только, но четкого понятного решения не обнаружи посуму обращаюсь к своему любимому форуму )
« Последнее редактирование: Май 30, 2015, 13:07 от Денис » Записан
Денис
Гость
« Ответ #1 : Май 30, 2015, 14:04 »

Кажись потихоньку стал понимать проблемы вроде бы была в том что App -> X11 отсылал данные X Serer-у а он у меня на компе был выключен вот и не приходили пакеты ... щас буду бороться с этим
Записан
Денис
Гость
« Ответ #2 : Май 30, 2015, 16:51 »

Отключил рабочий стол но проблема осталась, объект не получает сообщения readyRead()  Непонимающий
Есть догадки ?
Записан
Bepec
Гость
« Ответ #3 : Май 30, 2015, 17:54 »

хз, меня лично напрягает и название темы и содержимое Улыбающийся Тема заезжена, у многих проблема та же. Хотя у всех всё нормально работает Улыбающийся

А вы сначала поймите что не работает - ваш поток, tcp сокет или же ваш код (грешу на код).
Вы не привели всего кода, за кадром остались самые важные части Улыбающийся

PS вы хоть в курсе, у вас сокеты создаются нормально или нет?
Записан
Денис
Гость
« Ответ #4 : Май 30, 2015, 18:26 »

хз, меня лично напрягает и название темы и содержимое Улыбающийся Тема заезжена, у многих проблема та же. Хотя у всех всё нормально работает Улыбающийся

А вы сначала поймите что не работает - ваш поток, tcp сокет или же ваш код (грешу на код).
Вы не привели всего кода, за кадром остались самые важные части Улыбающийся

PS вы хоть в курсе, у вас сокеты создаются нормально или нет?


Я же в первом посте написал, что приложение рабочее и под Виндой открывает потоки и работает нормально ! В Ubuntu тоже нормально но когда с графической частью, в консольном варианте не работает ...  Непонимающий

Какой вам еще код привести там очень много ветки не хватит, я привел куски открытия потока и создания сокета ...

Вот пример консольной вставки:
Код:
/*
 * Constructor console task
 */
Console::Console(QStringList agruments,QObject *parent) :
        QObject(parent)
{
    Console::agruments = agruments;
    // Function of fetch of user interface
    server = new SenseSystem::TechServer(config.port);
    connect(this,SIGNAL(println(QString)),this,SLOT(outStream(QString)));
    // Checking if server is started ?
    if(server != NULL)
    {
        // Set text to the text browser
        println("Server is working!\r\n");
        println("UTC: "+QDateTime::currentDateTimeUtc().toString()+"\r\n");
    }
    // If server isn't working
    else
    {
        // Set text to the text browser
        println("Server isn\'t working!!!\r\n");
        println("Please check the internet connection\r\n");
    }
}
Записан
Денис
Гость
« Ответ #5 : Май 30, 2015, 19:23 »

В качестве переключателя использую следующую конструкцию:

Код:
    // Checking if we need console application
    if(config.typeView == SenseSystem::CONSOLE)
    {
        QCoreApplication app(argc, argv);
        config.display = new Console(app.arguments());
        // Return end of application
        return app.exec();
    }
    // Checking if we need window application
    else
    {
        QApplication app(argc, argv);
        config.display = new MainWindow();
        ((MainWindow *) config.display)->show();
        // Return end of application
        return app.exec();
    }

Возможно проблема в QCoreApplication, ведь когда запускаю в графической режиме то readyRead() приходит, а при заданнии параметров для консольного старта - не приходит НепонимающийНепонимающий? Есть мысди по сему вопросу ?
Записан
Bepec
Гость
« Ответ #6 : Май 30, 2015, 19:38 »

Вы б ещё код окна привели.
Как бы вы спрашиваете - почему не приходит сигнал. А я и задаю вам вопрос - а вы уверены что у вас поток работает, что сокет нормально создаётся, что ваш сервер отвечает на запрос?

Я задаю вопрос про работу всего этого под линуксом. Может вы где в переменной создания сокета ошиблись, и он у вас выдаёт ошибку? Может у вас поток намертво блочится под линусом, из-за какого то вашего кода?

И вы на эти вопросы ещё сами себе не ответили, раз так вопрос поставлен Улыбающийся

PS делаете минимально рабочий пример и проверяете - работает или нет. Если работает - стучите себе по голову и ищете ошибку в коде. Если не работает - выкладываете на форум весь проект в архиве с cpp h qrc pro pri файлами в архиве.
Записан
Денис
Гость
« Ответ #7 : Май 30, 2015, 19:48 »

Вы б ещё код окна привели.
Как бы вы спрашиваете - почему не приходит сигнал. А я и задаю вам вопрос - а вы уверены что у вас поток работает, что сокет нормально создаётся, что ваш сервер отвечает на запрос?

Я задаю вопрос про работу всего этого под линуксом. Может вы где в переменной создания сокета ошиблись, и он у вас выдаёт ошибку? Может у вас поток намертво блочится под линусом, из-за какого то вашего кода?

И вы на эти вопросы ещё сами себе не ответили, раз так вопрос поставлен Улыбающийся

PS делаете минимально рабочий пример и проверяете - работает или нет. Если работает - стучите себе по голову и ищете ошибку в коде. Если не работает - выкладываете на форум весь проект в архиве с cpp h qrc pro pri файлами в архиве.

Я же уже привел все необходимые куски с connect(...) НепонимающийНепонимающий??
И смысл стого что я вышлю проект у вас нету специализированного железа для  работы с ним, там сервер с собственным протоколом Непонимающий?? Сильно вам поможет то что я вышлю проект, а вы скажите проект не рабочий стучите по голове ... зачем ?!
Выслать то я могу но нужен ваш IP для подключения железа для работы к вашей машине Непонимающий?

Вот тут у чувака подобная ситуация, но он в графике запустил ... у меня в графике тоже работает ... ему там не помогли:
https://www.linux.org.ru/forum/development/7751902
Записан
Bepec
Гость
« Ответ #8 : Май 30, 2015, 20:04 »

*зануда мод он*
1) не надо мне ваш проект целиком, я просил лишь минимально компиляберный пример ОШИБКИ. Т.е. минимально компиляберный пример проекта, который принимает соединение (ЛЮБОЕ, ведь у вас это не работает, так?) и при этом выдаёт ошибку/не работает.
2) проверьте, посылает ли сервер пакет.
3) проверьте, работают ли сигналы в консольной версии.
4) напишите наконец версию ubuntu, в которой у вас проблема.
5) после всего этого соберитесь, возьмите себя в руки и по пунктам напишите ответ.
*зануда мод офф*

Вы показываете код, он не содержит ошибок на взгляд. Но система сигнал слотов зависима от того, что происходит у вас внутри, там, в программе. А не в методе, где просто происходит connect.

Записан
Денис
Гость
« Ответ #9 : Май 30, 2015, 20:12 »

*зануда мод он*
1) не надо мне ваш проект целиком, я просил лишь минимально компиляберный пример ОШИБКИ. Т.е. минимально компиляберный пример проекта, который принимает соединение (ЛЮБОЕ, ведь у вас это не работает, так?) и при этом выдаёт ошибку/не работает.
2) проверьте, посылает ли сервер пакет.
3) проверьте, работают ли сигналы в консольной версии.
4) напишите наконец версию ubuntu, в которой у вас проблема.
5) после всего этого соберитесь, возьмите себя в руки и по пунктам напишите ответ.
*зануда мод офф*

Вы показываете код, он не содержит ошибок на взгляд. Но система сигнал слотов зависима от того, что происходит у вас внутри, там, в программе. А не в методе, где просто происходит connect.




*зануда мод он*
*зануда мод офф*

Оценил, смешно )

Ошибку не выдает, просто не принимает данные, но поработав раздупляется и начинает принимать, а потом опять ... Щас скину минимально рабочий ))
Записан
Nidxogg
Гость
« Ответ #10 : Май 30, 2015, 20:27 »

Может данные не доходят?

Недавно столкнулись с проблемой потери пакетов в маршрутизаторе
Записан
Bepec
Гость
« Ответ #11 : Май 30, 2015, 21:08 »

До человека не доходит что лишь по шагово отсекая проблему, можно её локализовать, а потом и решить.

И ему пытаются помочь, а он смеется (не осуждаю), но и не отвечает на прямо заданные вопросы.

А так как раздупляется, скорее всего напакостничали в коде. Или очередь забивают, или ещё что Улыбающийся

to Nidxogg: раз на винде всё работает, следовательно с сетью всё в порядке. Проблема в программе. Точнее в коде. И тут коронная фраза: "95% ошибки в вашем коде, 2% ошибок в ОС, 2% железные проблемы, 1% вина разработчиков Qt" Веселый
Записан
iptOt
Гость
« Ответ #12 : Май 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>
Записан
Денис
Гость
« Ответ #13 : Май 31, 2015, 11:03 »

До человека не доходит что лишь по шагово отсекая проблему, можно её локализовать, а потом и решить.

И ему пытаются помочь, а он смеется (не осуждаю), но и не отвечает на прямо заданные вопросы.

А так как раздупляется, скорее всего напакостничали в коде. Или очередь забивают, или ещё что Улыбающийся

to Nidxogg: раз на винде всё работает, следовательно с сетью всё в порядке. Проблема в программе. Точнее в коде. И тут коронная фраза: "95% ошибки в вашем коде, 2% ошибок в ОС, 2% железные проблемы, 1% вина разработчиков Qt" Веселый

Во-первых не смеюсь, а меня это улыбает ) Это разные вещи !

А дальше по пунктам:
1) не надо мне ваш проект целиком, я просил лишь минимально компиляберный пример ОШИБКИ. Т.е. минимально компиляберный пример проекта, который принимает соединение (ЛЮБОЕ, ведь у вас это не работает, так?) и при этом выдаёт ошибку/не работает:
Еще раз ошибку не выдает !!!!! А просто не получает данные, а постояв, потупив начинает получать данные ... нестабильно, в одной сессии получает, в другой нет, это как-то связано с потоками в консоли и классом QCoreApplication, ведь в графическом виде я создаю приложение QApplication и при запуске его под той же версией Ubuntu все работает, не работает только консольная версия и только на Ubuntu, в Windows работает. Получать начинает как мне кажется когда запускаю Putty в режиме X11-перенаправление. Щас зроблю мин-компилябити !
2) проверьте, посылает ли сервер пакет:
Еще раз не сервер посылает пакет, а клиент и это сервер не принимает данные в консоли на Ubuntu.
Клиент - специализироанное железо !
3) проверьте, работают ли сигналы в консольной версии:
Сигналы работаю так как в классе Server:
Код:
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newclient()));

И соединение все время открывается но не принимает байты, причем вообще не принимает, я уже опрос буфера по таймеру сделал, но там все равно пусто:
Код:
/*
 * Recive of the request to the server
 */
void SenseSystem::Client::socketReadClient(void)
{
    if(clientSocket->bytesAvailable() == 0)
        return;
    qDebug() << "Recieved some data";
.......................................................................
}
И ничего не принято (

4) напишите наконец версию Ubuntu, в которой у вас проблема:
Ubuntu 12.04.5 LTS
5) после всего этого соберитесь, возьмите себя в руки и по пунктам напишите ответ:
Собрася, взял в руки.  Веселый
Записан
Денис
Гость
« Ответ #14 : Май 31, 2015, 11:50 »

Вот мин-компилябиляти, посмотрим что скажут проффесионалы ):

http://files.d-lan.dp.ua/download.php?file=0828716e7734c1c039c62fc1ce3a839f
« Последнее редактирование: Май 31, 2015, 11:56 от Денис » Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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