QTcpSocket Übertragungsproblem

Alles rund um die Programmierung mit Qt
Antworten
Daedalus-XIII
Beiträge: 5
Registriert: 11. Juli 2005 12:30
Wohnort: Bielefeld

QTcpSocket Übertragungsproblem

Beitrag 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
Dateianhänge
zur Veranschaulichung des Problems ein hoffentlich verstaendliches Schema:
zur Veranschaulichung des Problems ein hoffentlich verstaendliches Schema:
protocol_prob.jpg (20.79 KiB) 2179 mal betrachtet
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Code bitte ins Studio...
Daedalus-XIII
Beiträge: 5
Registriert: 11. Juli 2005 12:30
Wohnort: Bielefeld

Beitrag 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);
  

}
Antworten