Russian Qt Forum

Qt => Работа с сетью => Тема начата: Денис от Май 30, 2015, 13:00



Название: QTcpSocket заезжанная тема !!!!!!!!!!
Отправлено: Денис от Май 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 работают оба варианта

Вычитал на форумах что эта проблема не у меня только, но четкого понятного решения не обнаружи посуму обращаюсь к своему любимому форуму )


Название: 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 тоже нормально но когда с графической частью, в консольном варианте не работает ...  ???

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

Вот пример консольной вставки:
Код:
/*
 * 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");
    }
}


Название: Re: QTcpSocket заезжанная тема !!!!!!!!!!
Отправлено: Денис от Май 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() приходит, а при заданнии параметров для консольного старта - не приходит ??????? Есть мысди по сему вопросу ?


Название: 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()));

И соединение все время открывается но не принимает байты, причем вообще не принимает, я уже опрос буфера по таймеру сделал, но там все равно пусто:
Код:
/*
 * 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) после всего этого соберитесь, возьмите себя в руки и по пунктам напишите ответ:
Собрася, взял в руки.  :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():
Код
C++ (Qt)
   connect(clientSocket,SIGNAL(readyRead()),this, SLOT(socketReadClient()));
 
и слот socketReadClient при получении данных нормально вызывается.

Archlinux.


Название: Re: QTcpSocket заезжанная тема !!!!!!!!!!
Отправлено: Денис от Май 31, 2015, 13:25
Странно.

Я просто рас комментировал строку в SenseSystem::Client::process():
Код
C++ (Qt)
   connect(clientSocket,SIGNAL(readyRead()),this, SLOT(socketReadClient()));
 
и слот 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
Сделал такую добавку и повалило ... Сообщение отлавиваются но ругается что нельзя передать сокет с родителем ...
Получается было да сокета с разными указателями, но одинаковыми дискрипторами и и все пакеты поступали в основной поток где был первоначальный сокет ... При передачи его во вторичный поток прием данных осуществляется.
Код:
/*
 * New client connection
 */
void SenseSystem::TechServer::newclient()
{
    // If server started
    qDebug() << QString::fromUtf8("New connection!!!");

    QTcpSocket *socket = tcpServer->nextPendingConnection();
    qintptr IDSocket = socket->socketDescriptor();

    QThread *thread = new QThread(this);
    Client *client = new Client(socket);
    socket->moveToThread(thread);
    client->moveToThread(thread);

Но как его создать во вторичном потоке и при этом отключить отлавливание событий в главном, или коректно переместить ?????


Название: 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 под консолью не работает:
Обработка нового клиента
Код:
/*
 * New client connection
 */
void SenseSystem::TechServer::incomingConnection(qintptr socketDescriptor)
{
    // If server started
    qDebug() << "New request to connect!!!!!";

    QTcpSocket *clientSocket = new QTcpSocket();
    socket.insert(socketDescriptor,clientSocket);

    // Trying to connect to socket descriptor
    if (!socket[socketDescriptor]->setSocketDescriptor(socketDescriptor))
    {
        // Can't connect to socket descriptor
        socket[socketDescriptor]->deleteLater();
        socket.remove(socketDescriptor);
    }
    else
    {
        // setup signal and slot
        connect(socket[socketDescriptor],SIGNAL(readyRead()),this,SLOT(socketReadClient()));
        // Initiolization settings for system
        QTimer *timerOut = new QTimer(this);
        autoriz.insert(socketDescriptor,timerOut);
        // setup signal and slot
        connect(autoriz[socketDescriptor],SIGNAL(timeout()),this,SLOT(autorizTimeout()));
        // Reading command from MySQL
        autoriz[socketDescriptor]->start(15000);
    }
}

Перемещаю
Код:
            QThread *thread = new QThread(this);
            clientSocket->moveToThread(thread);
            Client *client = new Client(clientSocket,sql,IDSystem);
            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()));
            // Starting the thread of socket to execute events
            connect(clientSocket,SIGNAL(readyRead()),client, SLOT(socketReadClient()));
            connect(clientSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),client, SLOT(clientChangeState()));
            connect(clientSocket,SIGNAL(error(QAbstractSocket::SocketError)),client, SLOT(socketErrorClient()));
            connect(clientSocket,SIGNAL(disconnected()),client, SLOT(socketRemoveClient()));
            // Удаляем поток, после выполнения операции
            if(config.typeView == CONSOLE)
            {
                connect(client,SIGNAL(println(QString)),((Console *)config.display),SLOT(outStream(QString)));
                connect(client,SIGNAL(addClientToList(qintptr)),((Console *)config.display),SLOT(addClientToList(qintptr)));
            }
            else if(config.typeView == WINDOW)
            {
                connect(client,SIGNAL(println(QString)),((MainWindow *)config.display),SLOT(outStream(QString)));
                connect(client,SIGNAL(addClientToList(qintptr)),((MainWindow *)config.display),SLOT(addClientToList(qintptr)));
            }
            connect(client,SIGNAL(removeClientFromList(qintptr)),this,SLOT(removeMap(qintptr)));

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

Опять теже грабли, под Виндой и консольный вариант работает, а в 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