Невозможно записать данные в QT с помощью сокетов TCP из приложения, не являющегося QT - PullRequest
0 голосов
/ 22 апреля 2020

Я создал один сервер в своем приложении QT и клиент в приложении, отличном от qt.

Код моего сервера в приложении QT выглядит следующим образом:

#ifndef MMI_TCPSERVER_H
#define MMI_TCPSERVER_H

#include <QTcpServer>
#include <QTcpSocket>
#include "MMISimForm.h"

class MyTcpServer : public QTcpServer
{
    Q_OBJECT

public:
     MyTcpServer(MMISimForm *simForm, int portNo);
     void startServer();

private:
    int portNo_;
    MMISimForm* simForm_;
    QTcpSocket *socket;

    void OnConnected();

protected:
    void incomingConnection(qintptr socketDescriptor);

public slots:
    void OnReadyRead();
    void OnDisconnected();
};

#endif

#include "MyTcpServer.h"

MyTcpServer::MyTcpServer(MMISimForm *simForm, int portNo) :
    simForm_(simForm), portNo_(portNo)
{
    portNo_ = portNo;
}


void MyTcpServer::startServer()
{
    if(!this->listen(QHostAddress::Any, portNo_))
    {
        //qDebug() << "Could not start server";
    }
    else
    {
        //qDebug() << "Listening to port " << portNo_ << "...";
    }
}

void MyTcpServer::incomingConnection(qintptr socketDescriptor)
{
    socket = new QTcpSocket();

    // set the ID
    if(!socket->setSocketDescriptor(socketDescriptor))
    {
        //OnErrorSocket(socket->error());
        return;
    }
    else
    {
        simForm_->logMessage("Server Started");
        socket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
        //OnConnected();
    }

    // connect socket and signal
    // note - Qt::DirectConnection is used because it's multithreaded
    //        This makes the slot to be invoked immediately, when the signal is emitted.
    connect(socket, SIGNAL(readyRead()), this, SLOT(OnReadyRead()), Qt::DirectConnection);
    connect(socket, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));
}


// TcpServer
//---------------------------------------------------------------------------
//
// Reads incoming TCH command
void MyTcpServer::OnReadyRead()
{
    const QString cmdStr(socket->readAll());
    simForm_->logMessage("Server Started");

}

void MyTcpServer::OnDisconnected()
{
    simForm_->logMessage("Server Closed");
}

, а код клиента - в моем не qt-приложении

#include "ServerSocket.h"
ServerSocket::ServerSocket()
{
    WSAStartup(0x0101, &w) != 0;
    /* Open a datagram socket */
    sd = socket(AF_INET, SOCK_STREAM, 0);

    /* Clear out server struct */
    memset((void *)&server, '\0', sizeof(struct sockaddr_in));

    server.sin_family = AF_INET;
    server.sin_port = htons(5000);
    server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    connect(sd, (struct sockaddr *)&server, sizeof(server));
}

И у меня есть одна функция отправки, которая отправляет данные на сервер как

int ServerSocket::sendData()
{
   send(sd , "hello" , strlen("hello") , 0 );
}

Я проверил возвращаемое значение функции отправки, которое приходит как 5 средних байты данных отправляются правильно.

Но сигнал readyRead не посылается. Поэтому я не могу захватить данные в QT.

Что я делаю неправильно? QT GUI событие l oop работает правильно (приложение: exe c ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...