Seite 1 von 1
QSslSocket server/client
Verfasst: 14. Juni 2008 21:18
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
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
Verfasst: 16. Juni 2008 08:27
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
Verfasst: 17. Juni 2008 15:41
von haldol
hat da wirklich niemand eine idee zu?
ich nehme an, das problem liegt auf der client seite. ein dort eingebautes
gibt 18 bytes an.
fehlt da ansonsten etwas, was ich übersehe?
Verfasst: 17. Juni 2008 16:28
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.
Verfasst: 19. Juni 2008 01:11
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.
im client habe ich auch
entfernen müssen, und nur
Code: Alles auswählen
if(socket->waitForEncrypted())
{
qDebug("Connection Encrypted!");
}
qDebug() << socket->readAll();
stehengelassen.
nun denn