MySQL connection through QTcpSocket/QTcpServer ?
-
Hello.
In first, sorry for my english.I try during all the weekend to realize a SSH tunnel and I'm blocked with the QTcp. So for my question, I talk about a simple port forwarding.
I create a QTcpserver listening on the arbitrary port 4587. When a new connection occure, a slot create two sockets :
-
The first assuring the client connection (4587<->Appli)
-
The second assuring the server connection (Appli<->3306)
Each socket have its associated slot assuring the listening (signal readyRead()) and transmit directly the data to the opposite.
I don't understand why (but I know why I don't understand : I'm a newb) : if I transmit line by line (readLine directly injected in the QDatastream) : the connections are totaly blocked (tested for port 80HTTP & 3306SQL). If I pool the incomming data, it's the same for MySQL but not for HTTP (I have the html, whitout linked content like picture : it's normal I think).
My objectif is juste to forward my MySQL_client:3306 <-to an arbitrary port-> 4587:MySQL_server. (the SSH tunnel is done and fonctionnal)
Thanks for your help !
Tran
serverTcp.h
#ifndef SERVERTCP_H
#define SERVERTCP_H
#include <QObject>
#include <QTcpSocket>
#include <QTcpServer>
#include <QDebug>
#include <QMutex>
#include <stdio.h>
#include <QApplication>
#include <QVector>
#include <QByteArray>
#include <QBitArray>
#include <QHostInfo>
class serverTcp : public QTcpServer
{
Q_OBJECT
public:
explicit serverTcp();
~serverTcp();
signals:
public slots:
void demande_connexion() ;
void lecture();
void lectureE();
private:
QTcpSocket *clientConnection;
QTcpSocket *emitter;
QDataStream texte;
QDataStream texteE;
};
#endif // SERVERTCP_H
serverTcp.cpp
#include "servertcp.h"
serverTcp::serverTcp()
{
qDebug() << "Server on";
listen(QHostAddress::Any,4587);
QObject:: connect(this, SIGNAL(newConnection()),
this, SLOT(demande_connexion()));
}
void serverTcp :: demande_connexion()
{
qDebug() << "Incoming connection";
clientConnection = nextPendingConnection();
qDebug() << "Feedback";
emitter = new QTcpSocket();
emitter->connectToHost("127.0.0.1", 80, QTcpSocket::ReadWrite);
texte.setDevice(emitter);
texteE.setDevice(clientConnection);
qDebug() << "Listener initialization";
QObject:: connect(clientConnection, SIGNAL(readyRead()), this, SLOT(lecture()));
QObject:: connect(emitter, SIGNAL(readyRead()), this, SLOT(lectureE()));
}
void serverTcp ::lecture()
{
qDebug() << "Listenning...";
QByteArray tempIn;
while(clientConnection->canReadLine())
{
// tempIn.append(clientConnection->readLine());
if(clientConnection->readLine().length()) { texte.writeRawData(clientConnection->readLine(), clientConnection->readLine().length()); }
}
//texte.writeRawData(tempIn, tempIn.length());
qDebug() << tempIn << "-" << tempIn.length();
}
void serverTcp ::lectureE()
{
qDebug() << "Answers...";
QByteArray tempOut;
while(emitter->canReadLine())
{
//tempOut.append(emitter->readLine());
if(emitter->readLine().length() > 0) { texteE.writeRawData(emitter->readLine(), emitter->readLine().length()); }
}
//texteE.writeRawData(tempOut, tempOut.length());
qDebug() << tempOut << "-" << tempOut.length();
}
serverTcp::~serverTcp()
{}
-
-
Hi and welcome to devnet,
Why not use openssh directly to create your tunnel ?
-
Hi.
I wanted integrate the SSH tunnel into the software client.
So it's done... I just arrived to do my SSH tunnel \o/
I think, because I have spend 4 days on this problem, share the source with libssh.
EDIt ; I don't know openssh, I haven't find c++ library...
-
OpenSSH however, it's not a library
Did you also check the possibility to setup a secure channel directly through the MySQL plugin ?
-
Yes. QSqlDatabase include a SSL connection method, but to do my connection through the hardware firewall, I must do a Tunnel on SSH protocol (always opened).
All work, I post the "solution" here : http://www.qtfr.org/viewtopic.php?id=17959.
For an "integrated" use, I must launch it by QProcess. It's is very efficiency for me, simple and I can get the stdout easly by the QProcess.
-
Thanks for sharing your solution !