Чтение из доменного сокета UNIX (QLocalSocket) на Qt - PullRequest
0 голосов
/ 19 сентября 2018

У меня проблемы с чтением из сокета домена UNIX, серверное приложение основано на Python, и мне нужно реализовать IPC для связи с приложением Qt в качестве клиента.Серверное приложение протестировано и работает с клиентским приложением Python.Вот что я имею на стороне Qt-клиента:

unixsocket.cpp

#include "unixsocket.h"
#include <stdio.h>

UnixSocket::UnixSocket(QObject *parent) :
    QObject(parent)
{
    this->socket = new QLocalSocket (this);
}

UnixSocket::~UnixSocket(){}

void UnixSocket::Test ()
{
    connect (this->socket, SIGNAL(connected()), this, SLOT(connected_callback()));
    connect (this->socket, SIGNAL(disconnected()), this, SLOT(disconnected_callback()));
    connect (this->socket, SIGNAL(readyRead()), this, SLOT(readyRead_callback()));
    connect (this->socket, SIGNAL(bytesWritten(qint64)), this, SLOT(bytesWritten_callback(qint64)));

    qDebug() << "Connecting...";

    socket->connectToServer(ADAPTER_SOCKET);

    if (!socket->waitForConnected(1000))
    {
        qDebug() << "Error: " << this->socket->errorString();
    }
    else
    {
        in.setDevice(socket);
        in.setVersion(QDataStream::Qt_5_8);
        this->blockSize = 0;

    }

}

void UnixSocket::connected_callback()
{
    qDebug() << "Connected to " << socket->fullServerName();

}

void UnixSocket::disconnected_callback()
{
    qDebug() << "Disconnected!";
}

void UnixSocket::bytesWritten_callback(qint64 bytes)
{
    qDebug() << "We wrote: " << bytes;
}

void UnixSocket::readyRead_callback()
{
    qDebug() << "Reading...";
    qDebug() << "Block Size: " << this->blockSize;

    if (this->blockSize == 0) {
        // Relies on the fact that QDataStream serializes a quint32 into
        // sizeof(quint32) bytes
        if (socket->bytesAvailable() < (int)sizeof(quint32))
            return;
        in >> this->blockSize;
    }

    if (socket->bytesAvailable() < this->blockSize || in.atEnd())
        return;

    QString recvd_data;
    in >> recvd_data;
    qDebug() << recvd_data;
}

unixsocket.h

#ifndef UNIXSOCKET_H
#define UNIXSOCKET_H

#include <QObject>
#include <QAbstractSocket>
#include <QLocalSocket>
#include <QtNetwork>
#include <QIODevice>
#include <QDebug>
#include <QTextStream>
#include <QDataStream>

#define ADAPTER_SOCKET "/opt/adapter/socket"


class UnixSocket: public QObject
{
    Q_OBJECT

public:
    explicit UnixSocket(QObject *parent = 0);
    ~UnixSocket();
    void Test ();

signals:

public slots:

    void connected_callback();
    void disconnected_callback();
    void bytesWritten_callback (qint64 bytes);
    void readyRead_callback();

private:
    QLocalSocket *socket;
    QDataStream in;
    quint32 blockSize;
};

#endif // UNIXSOCKET_H

и main.cpp для класса огня:

int main(int argc, char* argv[])
{
    UnixSocket mUnixSocket;
    mUnixSocket.Test();
    while (1);
    return 1;
}

Теперь соединение Unix Domain Socket работает нормально.Итак, я получаю сообщение «связано».И я уверен, что сервер отправляет некоторые данные асинхронно, но по какой-то причине моя программа вообще не вводит readyRead_callback.Мне нужны указатели относительно того, как решить эту проблему.С благодарностью приветствуется любая помощь.

1 Ответ

0 голосов
/ 19 сентября 2018

должны находиться в цикле событий Qt, и в вашем случае у вас их нет, поэтому он не работает для вас, поэтому измените код на:

int main(int argc, char *argv[]) { 
    QCoreApplication a(argc, argv);
    UnixSocket mUnixSocket; 
    mUnixSocket.Test(); 
    return a.exec(); 
}
...