QSslSocket server/client

Alles rund um die Programmierung mit Qt
Antworten
haldol
Beiträge: 19
Registriert: 18. April 2008 22:23

QSslSocket server/client

Beitrag von haldol »

hi,

ich versuche auf basis des beispiels 'threaded fortune server' mit qsslsocket einen server/client zu schreiben.
ich kann nun auch eine verbindung zum server aufbauen, die test-strings werden aber nicht transportiert bzw. nicht auf dem clienten ausgegeben.
den quelltext habe ich hier untergebracht:
http://nopaste.debianforum.de/8969

Code: Alles auswählen

qDebug() << serverSocket->isEncrypted();
gibt false zurück.
es wäre supernett wenn da mal jemand drauf gucken würde und mir eventuell einen tip geben kann.

michael

edit:
bei der verwendung der keys bin ich unsicher.
derzeit sind sie auskommentiert.
ich habe für client und server jeweils ein paar erstellt und diese eingetragen. ein test brachte ausser der geforderten passworteingabe keinen erfolg
haldol
Beiträge: 19
Registriert: 18. April 2008 22:23

Beitrag von haldol »

so, ich bin jetzt ein stück weiter. nachdem ich probleme mit den zertifikaten beseitigt habe, wird auf beiden seiten gemeldet, das die verbindung verschlüsselt ist - das encrypted() signal wird gesendet.

danach bekomme ich nun allerdings kein readyRead(), sodass weiterhin keine daten übermittelt werden.
der entsprechende code sieht mittlerweile folgendermaßen aus.
auf server seite:

Code: Alles auswählen

void SslThread::run()
{
	QTcpSocket *tcpSocket = new QTcpSocket;
	QSslSocket *serverSocket = new QSslSocket(tcpSocket);
	
	QByteArray pass("xxxxxx");
	serverSocket->setLocalCertificate("server.cert.crt"); 
	serverSocket->setPrivateKey("privkey.pem",QSsl::Rsa,QSsl::Pem,pass); 
	
	if(serverSocket->setSocketDescriptor(socketDescriptor))
	{
		connect(serverSocket, SIGNAL(encrypted()), this, SLOT(ready()));
		serverSocket->startServerEncryption();
	} 
	else {
		emit error(serverSocket->error());
		delete serverSocket;
		delete tcpSocket;
		return;
	}
	
	QByteArray block;
	QDataStream out(&block, QIODevice::WriteOnly);
	out.setVersion(QDataStream::Qt_4_0);
	out << (quint16)0;
	out << text;
	out.device()->seek(0);
	out << (quint16)(block.size() - sizeof(quint16));
	
	serverSocket->write(block);
	serverSocket->disconnectFromHost();
	serverSocket->waitForDisconnected();
}
im clienten:

Code: Alles auswählen

int main(int argc, char **argv)
{
       QCoreApplication app(argc, argv);
        QSslSocket *socket = new QSslSocket;
        socket->connectToHostEncrypted("127.0.0.1", 4711);
	socket->ignoreSslErrors();
	
	if(socket->waitForEncrypted(1000)) {
		qDebug("Connection Encrypted!");
	}
	while(socket->waitForReadyRead())
	{	
		qDebug("ready-read");
		qDebug() << socket->readAll();
	}
	return app.exec();
}
vielleicht kann mir an der stelle jemand einen tip geben.

bye
michael
haldol
Beiträge: 19
Registriert: 18. April 2008 22:23

Beitrag von haldol »

hat da wirklich niemand eine idee zu?
ich nehme an, das problem liegt auf der client seite. ein dort eingebautes

Code: Alles auswählen

qDebug() << socket->bytesAvailable();
gibt 18 bytes an.
fehlt da ansonsten etwas, was ich übersehe?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

haldol hat geschrieben:hat da wirklich niemand eine idee zu?
Das Problem ist das man sich mit so etwas befassen muss, um dazu was sagen zu können. Werden wohl nicht viele machen, also gibt es nicht viele Antworten. Persönlich kämpfe ich gerade mit verschlüsselten QtSoap-Requests, bei denen ich kein responseHeaderReceived-Signal bekomme. Allerdings nur, wenn ein ISA-Proxy dazwischen hängt. Ist ein komplexes Thema. Guck mal im TaskTracker, vielleicht findet sich da noch mehr.

Viel Erfolg beim debuggen und vergiss nicht die Lösung zu posten.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
haldol
Beiträge: 19
Registriert: 18. April 2008 22:23

Beitrag von haldol »

erstmal vielen dank für deine antwort.
der gdb in eclipse, meldet das io/qdatastream.cpp nicht gefunden wird.
nachdem ich das 'QByteArray' und den 'QDataStream' rausgenommen habe, ist es nun erstmal möglich char strings zu übermitteln.

Code: Alles auswählen

serverSocket->write("42");
im client habe ich auch

Code: Alles auswählen

while(socket->waitForReadyRead())
...
entfernen müssen, und nur

Code: Alles auswählen

if(socket->waitForEncrypted()) 
{
		qDebug("Connection Encrypted!");
}
qDebug() << socket->readAll();
stehengelassen.

nun denn
Antworten