[C++,Qt] Problem mit QTcpSocket

SuperSonik

Erfahrenes Mitglied
Hallo Leute,
ich habe ein Problem mit QTcpSocket.
Ich bin soweit, dass ich eine Verbindung aufgebaut habe, und eine Anfrage nach Daten ist auch erfolgreich versendet.
Jetzt habe ich das Signal readyRead() mit einem eigenen Slot getData() verbunden.
Das Problem ist, dass ich nicht sagen kann was ich für Daten bekomme und wie groß die
sind. Ich möchte eigentlich alles was ankommt hintereinander eine Datei schreiben.
Alle Versuch sind aber bisher kläglich gescheitert. Ich bekomme im Moment Speicherzugriffsfehler. :(

Hier mein jetziger Stand:
Code:
void  getData(void){
    QDataStream in(tcpsocket);
     in.setVersion(QDataStream::Qt_4_2);
   	QFile confdatei("testdata.txt");
   	confdatei.open(QFile::WriteOnly);
   	QTextStream conf(&confdatei);
 
 	if(blockSize == 0xFFFF){
		return;
	}
     if (blockSize == 0) {
         if (tcpsocket->bytesAvailable() < (int)sizeof(quint16))
             return;

         in >> blockSize;
     }

	if(blockSize == 0xFFFF){
		return;
	}
     if (tcpsocket->bytesAvailable() < blockSize)
         return;

     QString nextData;
     in >> nextData;
 
 	conf << nextFortune;

     
};//getData
 
Ich bin's nochmal.
Ich habe inzwischen ein paar Fehlerquellen beseitigt, aber laufen tut's immer noch nicht. :(
Hier mein jetziger Stand:

Code:
void connectToServer(void){
pushButton_abfragen->setText(tr("Abfragen 2......"));
tcpsocket.connectToHost(lineEdit_ipgypsy->text(),5050);
pushButton_abfragen->setText(tr("Abfragen ......"));
pushButton_upload->setEnabled(false);
pushButton_abfragen->setEnabled(false);    		
 
};//connectToServer

void  sendRequest(void){

QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_2);
QString abfrage("SELECT * FROM Historie; \r\n");


out << quint16(0) << abfrage.toAscii();
out.device()->seek(0);
out << quint16(block.size() - sizeof(quint16));
tcpsocket.write(block);
pushButton_abfragen->setText(tcpsocket.errorString());

};//sendRequest 

void  getData(void){
	pushButton_abfragen->setText(tr("Abfragen 2......"));
	pushButton_abfragen->setText(tcpsocket.errorString()+"   --1");
	
   	QFile confdatei("testdata.txt");
   	confdatei.open(QIODevice::WriteOnly);
   	QDataStream conf(&confdatei);
 	QByteArray ip,wert,datum;
    conf.setVersion(QDataStream::Qt_4_2);
    
	//pushButton_abfragen->setText(tcpsocket.errorString()+"   --2");    
	
     QDataStream in(&tcpsocket);
     in.setVersion(QDataStream::Qt_4_2);
     
 	//pushButton_abfragen->setText(tcpsocket.errorString()+"   --3");
     
     forever{
     	
     if(nextBlockSize == 0){
     if(tcpsocket.bytesAvailable() < sizeof(quint16)){ break; }
     	in >> nextBlockSize;	
     }	
     if(nextBlockSize == 0xFFFF){
     	closeConnection();
   		break;  	
     }
     if(tcpsocket.bytesAvailable() < nextBlockSize){ break;}
     
    conf << tcpsocket.readAll();//ip << wert << datum;
    
     
     	nextBlockSize = 0;
     }


 	
	
     
};//getData

void  closeConnection(void){

tcpsocket.close();
pushButton_abfragen->setText(tr("Daten abfragen"));
pushButton_upload->setEnabled(true);
pushButton_abfragen->setEnabled(true);   

};//closeConnection

void displayError(QAbstractSocket::SocketError socketError)
 {
     switch (socketError) {
     case QAbstractSocket::RemoteHostClosedError:
         break;
     case QAbstractSocket::HostNotFoundError:
         QMessageBox::information(this, tr("Fortune Client"),
                                  tr("The host was not found. Please check the "
                                     "host name and port settings."));
         pushButton_abfragen->setText(tr("Daten abfragen"));
		 pushButton_upload->setEnabled(true);
		 pushButton_abfragen->setEnabled(true);
         break;
     case QAbstractSocket::ConnectionRefusedError:
         QMessageBox::information(this, tr("Fortune Client"),
                                  tr("The connection was refused by the peer. "
                                     "Make sure the fortune server is running, "
                                     "and check that the host name and port "
                                     "settings are correct."));
         pushButton_abfragen->setText(tr("Daten abfragen"));
         pushButton_upload->setEnabled(true);
         pushButton_abfragen->setEnabled(true);
         break;
     default:
         QMessageBox::information(this, tr("Fortune Client"),
                                  tr("The following error occurred: %1.")
                                  .arg(tcpsocket.errorString()));
         pushButton_abfragen->setText(tr("Daten abfragen"));
		 pushButton_upload->setEnabled(true);
		 pushButton_abfragen->setEnabled(true);
     }
nextBlockSize und tcpsocket sind Membervariablen und die Connections habe ich auch gemacht.
Ich bekomme an der Stelle "pushButton_abfragen->setText(tcpsocket.errorString()+" --1");" immer die Meldung "Unknown error".
Das hilf natürlich nicht.
Den Slot displayError habe ich aus einem Beispiel aus der Qt Doku.
Aber noch nicht mal der default-Zweig wird jemals aufgerufen -> QTcpSocket liefert also keinen Fehler.
Ich bin total ratlos, vielleicht findet sich ja doch jemand der mir weiterhelfen kann. :(
Gruß,

Sonik
 
Hallo,
ich nochmal.
Ich bin mittlerweile der Meinung das der Fehler an dem QString beim senden liegen muß:
Code:
QString abfrage("SELECT * FROM Datum; \r\n");
Vielleicht liegt's irgendwie an dem \r\n aber wenn ich die weg lasse bekomme ich direkt einen
Fehler. \0 habe ich auch schon versucht.
Die Verbindung wird sofort geschlossen, ohne das ich Daten gesendet bekomme.
Sprich auf das Senden der Anfrage wird als Antwort das disconnected() Signal ausgelöst.:confused:
Hat jemand eine Ahnung? :( Ich bin auch schon dankbar für Tipps, was ich noch versuchen könnte.
Gruß,
SuperSonik
 
Zurück