[geloest] Lesen aus QTcpSocket

Alles rund um die Programmierung mit Qt
Antworten
felixthehelix
Beiträge: 2
Registriert: 21. November 2006 11:35
Wohnort: Bonn

[geloest] Lesen aus QTcpSocket

Beitrag von felixthehelix »

Hallo allerseits,

ich versuche seit geraumer Zeit eine Client-Server Anwendung auf Basis der Fortune-Beispile von QT zu schreiben. Auch nach ausgiebiger Suche in den Qt Foren verstehe ich nicht, wieso ich vom Client aus nicht lesen kann. Die formal selbe Funktion im Server liest mir wunderschoen den String aus, beim Client ist er immer leer. Ich habe schon alle moeglichen anderen Wege ausprobiert.. ueber QByteArrays mit readAll/Line. Dort ist dann
qbyteArray.size() > 0, aber
qbyteArray.data() ein leerer String.

Waere super, wenn mir jemand weiterhelfen koennte.
Hier mal meine Funktionen, zuerst die des Clients, der versuchen soll das 'hallo' des Servers zu lesen.

Code: Alles auswählen

void Client::readHello()
{
printf("trying to receive a message..\n");

QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);

quint16 blockSize;
int i = 0;

while ((tcpSocket->bytesAvailable() < (int)sizeof(quint16)) && (i < 3)) {
	printf("Nothing recieved\n");
	sleep(1);
	i++;
	tcpSocket->disconnectFromHost();
	return;
	}
in >> blockSize;
if (blockSize == 0) {
	printf("Received block has size zero\n");
	tcpSocket->disconnectFromHost();
	return;
	}
if (tcpSocket->bytesAvailable() < blockSize) {
	printf("Too few bytes received\n");
	tcpSocket->disconnectFromHost();
	return;
	}
QString message;
in >> message;

printf ("text is %s \n",  message.toLatin1().data());
if (message.size() == 0) {
	printf("hello message is empty\n");
	tcpSocket->disconnectFromHost();
	return;
	}


}

Und die Server Funktion, die auf jeden neue Verbindung hin das hier ausfuehrt:

Code: Alles auswählen

void Server::sendHello()
{
    printf("got a new connection.. sending the hello..\n");
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << "\nHello, welcome to the Boratd server \n";
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    clientConnection = tcpServer->nextPendingConnection();
    connect(clientConnection, SIGNAL(disconnected()),
 	          clientConnection, SLOT(deleteLater()));

qint64 size = clientConnection->write(block);

if (!clientConnection->waitForBytesWritten()) qWarning("Error while writing to network");
printf("%d Bytes sent.\n", (int) size);
connect (clientConnection, SIGNAL(readyRead()), this, SLOT(receiveHandler()));
connect (clientConnection, SIGNAL(bytesWritten(bytesSent)), this, SLOT(sendHandler()));
clientStatus = HELLO_SENT;

}
Zu guter letzt noch die Ausgaben:
Der Server sendet wunderbar:

got a new connection.. sending the hello..
61 Bytes sent.

Aber ich kann es nicht auslesen:

trying to receive a message..
text is
hello message is empty

mittels tcpSocket->bytesAvailable() sehe ich, dass eigentlich alle Daten angekommen sind.. ich bin einfach ratlos. Hoffe jemand kann mir helfen. Danke im Voraus,

Felix
Zuletzt geändert von felixthehelix am 21. November 2006 12:57, insgesamt 1-mal geändert.
felixthehelix
Beiträge: 2
Registriert: 21. November 2006 11:35
Wohnort: Bonn

geloest

Beitrag von felixthehelix »

Manchmal hilft ja allein das Formulieren eines Problems.

Kurz nach meinem Post ist mir die Loesung klargeworden:
Wenn ich in der Server funktion mittels

QString msg = "Hello, welcome to the Boratd server";
...
out << msg;

sende kommt auch ein QSTRING an. Verdammt.

Danke trotzdem alldenen, die sich jetzt meine 5000 Zeilen durchgelesen haben.

Gruesse,
Felix
Antworten