Sockets, dem Clienten einfach seine Nachricht zurückschicken

Alles rund um die Programmierung mit Qt
Antworten
PhilipLB
Beiträge: 13
Registriert: 14. September 2007 01:49

Sockets, dem Clienten einfach seine Nachricht zurückschicken

Beitrag von PhilipLB »

Hi,
ich bastel mir hier einen Server, aufbauend auf dem ThreadedFortuneServer.
Aus der server.cpp:

Code: Alles auswählen

void Server::incomingConnection(int socketDescriptor)
{
    QString fortune = fortunes.at(qrand() % fortunes.size());
    ServerThread *thread = new ServerThread(socketDescriptor, fortune, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}
So, der Thread sieht dann mittlerweile so aus:

Code: Alles auswählen

#include "serverThread.h"

#include <QtNetwork>

ServerThread::ServerThread(int socketDescriptor, const QString &fortune, QObject *parent)
    : QThread(parent), text(fortune) {
	socket = new QTcpSocket;
	socket->setSocketDescriptor(socketDescriptor);
}

ServerThread::~ServerThread() {
	free(socket);
}

void ServerThread::run()
{
	while (socket->state() == QTcpSocket::ConnectedState) {
		if (socket->canReadLine()) {
			readClient();
		}
		sleep(1);
	}
    
	
	socket->disconnectFromHost();
	socket->waitForDisconnected();
}

void ServerThread::readClient() {
    
    QString clientText(socket->readLine().data());
	QByteArray block;
	QDataStream out(&block, QIODevice::WriteOnly);
	out.setVersion(QDataStream::Qt_4_0);
	out << (quint16)0;
	out << clientText;
	out.device()->seek(0);
	out << (quint16)(block.size() - sizeof(quint16));
	
	socket->write(block);
	socket->flush();
	

}
Das ganze läuft unter Windows mit Dev-C++, falls das hier was zur Sache tut.
Ich starte den Server und verbinde mich mit Telnet zu ihm.
Die erste Nachricht, die ich ihm mit Telnet schicke, schickt er auch brav zurück. Aber jede weitere ignoriert er. Warum?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Mache mal einen Breakpoint in ServerThread::run() nach der while-Schleife um zu schauen ob die Bedingung auch immer wahr ist. Ich habe so das Gefühl das dies nicht der Fall ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
PhilipLB
Beiträge: 13
Registriert: 14. September 2007 01:49

Beitrag von PhilipLB »

Yep, genau das ist das Problem, die Bedingung canReadLine() ist nur beim ersten mal wahr. Jede weitere angekommende Nachricht wird ignoriert.
Antworten