Seite 1 von 1

Sockets, dem Clienten einfach seine Nachricht zurückschicken

Verfasst: 14. September 2007 01:56
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?

Verfasst: 14. September 2007 13:14
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.

Verfasst: 14. September 2007 14:01
von PhilipLB
Yep, genau das ist das Problem, die Bedingung canReadLine() ist nur beim ersten mal wahr. Jede weitere angekommende Nachricht wird ignoriert.