Seite 1 von 1

QTcpSocket Übertragungsproblem

Verfasst: 27. Juli 2005 00:32
von Daedalus-XIII
Hallo,

ich arbeite momentan an einem grafischen Client eines nicht Qt-basierten Servers. Das "Basisprotokoll gestaltet sich ueber telnet bisher folgendermaßen (beispielhaft):

Code: Alles auswählen

Server Version 0.1 connected

>UPDATE REQUEST
UP
R 10 10
F 010 010 asdhdsdaffgklrffhjfsdlfdjfdsfjkhtfhdfjredhfdfhfjdfhsdsds
EUP

>BYE
BYE

Connection terminated
Soviel zur Telnet-Praxis, diese funktioniert auch hervorragend. Der QT-Client startet die Tcp-Verbindung als Thread, baut brav die Verbindung auf und lauscht auf ein readyRead()-Signal um die Rückmeldung in ein QByteArray zu schreiben.Mit der Serverversion beim connect funktioniert das ganze auch. Klickt man im Hauptfenster den disconnect-Button und sendet ein "BYE" an den Socket, wird die Antwort auch empfangen und ein disconnected()-Signal vom Thread gesendet.

Nun zum Problem: Sendet das Hauptfenster/alternativ auch der Thread ein "UPDATE REQUEST", wird in der Antwort vom Server nicht einmal das einleitende "UP" erkannt, das QByteArray für die Serverantwort bleibt scheinbar leer. Danach haengt der Socket und auch ein Disconnect kann nicht mehr ausgeführt werden.
Anmerkung: die 4 Antwortzeilen werden einzeln übertragen, mit abschließendem \n

Ich bin momentan ziemlich ratlos, da die Funktionsweise sich vor allem von dem BYE nicht unterscheidet. Hat vielleicht jemand eine Idee, wo der Denkfehler darin liegen könnte?

Gruß,
Marcel

Verfasst: 27. Juli 2005 00:59
von lepsai
Code bitte ins Studio...

Verfasst: 27. Juli 2005 07:57
von Daedalus-XIII
tcpthread.cpp (bisher nur simpler testcode)

Code: Alles auswählen

void TcpThread::run()
    {
        // connect QTcpSocket's signals somewhere meaningful
        //...
        socket.connectToHost(destHost, destPort);
				
        exec();
    }

void TcpThread::processData(){
	
 QByteArray in;
 in=socket.readLine(2048);
 QString message = QString(in);
 QString name =QString("TEST");
 
  if (in==""){
  // do nothing	
  } else if (in==CMD_QUIT){
 		socket.disconnectFromHost();
 		
 } else if (in==UPDATE_START) {
 
 	QMessageBox::warning( 0, name ,"update started");
 	
 } else if (in==UPDATE_END) {
 	
 	QMessageBox::warning( 0, name ,"update ended");
 	
 } else if (in.startsWith(RESOLUTION)) {
 	
 	QMessageBox::warning( 0, name ,"resolution line received");
 
 } else if (in.startsWith(FIELD)) {
 	
 	QMessageBox::warning( 0, name ,"field line received"));
 
 } else if (in==VERSIONLINE) {
 	
 	QMessageBox::warning( 0, name ,"field line received"));
 
 } else { 
 
//do nothing for now
 
 }


}

mainwindow.cpp

Code: Alles auswählen


// slots

// open connection
void ZUTMain::openConnDialog(){
	
	ConnDialog *loginDialog;
	loginDialog = new ConnDialog(this);
	loginDialog->connId=connectionIndex;
	connect(loginDialog, SIGNAL(connectServer(int, QString, int)), this, SLOT(establishConnection(int, QString, int)) );
	connect(&tcpThread.socket, SIGNAL(connected()), loginDialog, SLOT(close()));
	connect (&tcpThread.socket, SIGNAL(connected()), this, SLOT(addToActive()));
       connect (&tcpThread.socket, SIGNAL(connected()), this, SLOT(getUpdate()));
       connect (&tcpThread.socket, SIGNAL(disconnected()), this, SLOT (removeFromActive()));
	connect (&tcpThread.socket, SIGNAL(disconnected()), this, SLOT (removeFromActive()));
	
	
	loginDialog->show();
}


void ZUTMain::disconnectFromServer(){
	
	QVariant bytesWritten;
	
	char cmd[10];
	strcpy(cmd,"BYE\n");
        bytesWritten=tcpThread.socket.write(cmd, 10);
  

}

void ZUTMain::getUpdate(){
	
	QVariant bytesWritten;
	
	char cmd[30];
	strcpy(cmd,"UPDATE REQUEST\n");
        bytesWritten=tcpThread.socket.write(cmd, 30);
  

}