LINUX.ORG.RU

QCoreApplication QThread QTcpSocket нету данных в сокете ?

 ,


0

1

В общем тема с данного форума: http://www.prog.org.ru/topic_28948_0.html;topicseen

Пишу здесь потому что проблема в Ubuntu 12.04.5 LTS и здешняя аудитория больше подходит для решения данной проблемы.

Вообще в кратце проблема в следующем есть клиент серверное пиложение: Клиент - специализированное железо. Сервер - на Linux.

Сервер можно запускать с командами --view=console или --view=window. Так все версии под Виндой работают, а под Ubuntu - графическая версия работает, а консольная версия не работает, нету приема данных в сокете !!!!! Может быть уважаемая публика подскажет в чем может быть проблема ?

Силка на мин-компилябиляти:

http://files.d-lan.dp.ua/download.php?file=0828716e7734c1c039c62fc1ce3a839f

Бегло глянул. Всё плохо. Начиная от исходников в .rar с ошмётками типа «~$ на серверную часть.docx» на файлопомойке вместо github.

Использование глобальных переменных.

Бесполезные комментарии

/*
 * Main function started program
 */
int main(int argc, char *argv[])

Велосипеды вместо QCommandLineParser для разбора аргументов.

/*
 * Destructor of class MainWindow
 */
Console::~Console()
{
    delete server;
}

Непонимание принципа parent-child в Qt.

NULL вместо nullptr при CONFIG += c++11

функции вида foo(void)

Передача QString по значению

Сишные касты. Копипаст.

Даже разбираться не охота, пойду, руки помою.

anonymous
()

Код не читал, но дело в том, что твое чтение с терминала в линуксе блокируется, поэтому его надо делать в отдельном потоке.

vzzo ★★★
()
Ответ на: комментарий от vzzo

Я ничего не читаю в консоли, я открываю в главном потоке дочерний и передаю сокет ему ... не принимаются данные с QTcpSocket ... хотя в графике работает ? Вичитывание происходит данных с сокета ...

redradist
() автор топика

Качать RAR(!) архив с какого-то файлообменника с скриптами? Ты издеваешься?

Залей на gitlab/github/etc, и дай нормальный линк на проект.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от vzzo

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

/*
 * 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);

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

redradist
() автор топика

это конечно не решение вопроса.. но хочу мимолётом спросить ..

«\r\n» — это так правда требует Qt ?

user_id_68054 ★★★★★
()
Ответ на: комментарий от redradist

Если кому непонятно то я перемещая сокет в соседний поток. Но проблема в том что пишет невозможно переместить соседний поток с родителем ?????? Как бы это исправить ?

redradist
() автор топика
Ответ на: комментарий от user_id_68054

«\r\n» — это так правда требует Qt ?

Нет. Это, скорее всего, так требует препод-говноед. Ему видимо невдомёк, что \n на офтопике расскрывается в \r\n.

EXL ★★★★★
()
Ответ на: комментарий от redradist

У сокета уже будет родитель «tcpServer». Чтобы избежать этого тебе нужно создать свой класс Server, который надо унаследовать от QTcpServer и переписать метод

void QTcpServer::incomingConnection(qintptr socketDescriptor)

А внутри этого метода создавать клиентский сокет без родителя с помощью метода

bool QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState socketState = ConnectedState, OpenMode openMode = ReadWrite)

Смотри пример http://doc.qt.io/qt-5/qtnetwork-threadedfortuneserver-example.html

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

Спасибо, я так уже сделал но все равно нету приема данных в потоке где клиент, данные поступают в первый поток ?????? Может библиотек для потоковой работы не хватает ?

redradist
() автор топика
Ответ на: комментарий от user_id_68054

ОМГ. Нет, конечно. Я конечно понимаю, что винда требует именно \r\n, но любая библиотечная функция сама ставит правильный символ конца строки.

RiseOfDeath ★★★★
()
Ответ на: комментарий от redradist

~$ на серверную часть.docx init 19 hours ago

Чёт проиграл.

anonymous
()
Ответ на: комментарий от redradist

Спасибо, я так уже сделал но все равно нету приема данных в потоке где клиент, данные поступают в первый поток ?????? Может библиотек для потоковой работы не хватает ?

Каких ещё библиотек для потоковой работы?

Давай ещё раз вдумчиво почитай мануалы по потокам и по каждому классу, который ты используешь.

Chaser_Andrey ★★★★★
()

Может быть уважаемая публика подскажет в чем может быть проблема ?

//connect(clientSocket,SIGNAL(readyRead()),this, SLOT(socketReadClient()));

x905 ★★★★★
()

void Serv::newConnection()
{
    QTcpSocket* sock;
    Client* client;
    while(serv->hasPendingConnections())
    {
        sock = serv->nextPendingConnection();
        client = new Client(sock,sock->readAll());
        clients.append(client);
        clientInit(client);
        client->start();
        _TRACE("clients len" << clients.size());
    }
}

Client::Client(QTcpSocket *sock, QByteArray rx)
{
    rxMess.append(rx);
    moveToThread(&t);
    t.start();
    sockDescr = sock->socketDescriptor();
    sock->setParent(NULL);
    QMetaObject::invokeMethod(this,"init_inthread",Qt::BlockingQueuedConnection);
}

void Client::init_inthread()
{
    sock = new QTcpSocket();
    sock->setSocketDescriptor(sockDescr);
}

Client::~Client()
{
    t.quit();
    t.wait();
    if(sock->state() == QTcpSocket::ConnectedState) sock->disconnectFromHost();
    sock->close();
    delete sock;
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.