[Qt] QTcpSocket, bessere read-Methode
-
Hi,
ich hab einen Server, der Commands empfangen soll und dann ein paar Ereignisse ausführen soll.
Habs gestern endlich geschafft es iwie zusammen zu basteln, doch es gibt ein Problem: Wenn ich mit einem Clienten verbunden bin und dann mit einem anderen Clienten verbinde, kann der neue Client Commands senden, der alte nicht, aber bleibt noch immer verbunden.
(Client hab ich bisher nur per Telnet simuliert.)Liegt wrs. daran, dass ich den clienten immer unter lastClient speicher.
Aber guckts euch mal an.void iuserver::start() { if(!tcpServer->listen(QHostAddress::Any,1337)) { cout << "> UNABLE TO START THE SERVER !!!\n" << endl; } cout << ">> listening\n" << endl; connect(tcpServer, SIGNAL(newConnection()), this, SLOT(handleConnection())); } void iuserver::handleConnection() { QTcpSocket *client = tcpServer->nextPendingConnection(); cout <<">> Client ist verbunden mit IP: " << client->peerAddress().toString().toStdString() << endl; QString welcome; welcome = "+++++++++++++++++++++++++++++\n\r"; welcome += "+++++ Willkommen auf IU +++++\n\r"; welcome += "+++ Give me your Commands +++\n\r"; welcome += "+++++++++++++++++++++++++++++\n\r\n\r"; client->write(welcome.toAscii(),welcome.length()); lastClient = client; connect(client,SIGNAL(readyRead()),this,SLOT(handleMessages())); connect(this,SIGNAL(newCommand(string)),this,SLOT(handleCommands(string))); connect(client,SIGNAL(disconnected()), client, SLOT(deleteLater())); } void iuserver::handleMessages() { string cmd; // PROBLEM BEI MEHREREN CLIENTEN while(lastClient->canReadLine()) { QByteArray arr = lastClient->readAll(); QString mess( arr.data() ); cmd = mess.toStdString().substr(0,mess.toStdString().find("\r")); } if(!cmd.empty()) { emit newCommand(cmd); } } void iuserver::handleCommands(string cmd) { if(cmd == "the_command") { cout << "Understood!!!" << endl; } else if(cmd == "quit") { cout << ">> Verbindung wurde getrennt" << endl; lastClient->disconnectFromHost(); lastClient->close(); } else { cout << cmd << " unknown command" << endl; } }
Das Problem liegt vorallem daran, dass ich nicht weiß, wie ich sonst vollständige Commands empfangen kann, ohne:
[cpp] while(lastClient->canReadLine())[/cpp]
-
Du kannst zb in iuserver::handleMessages per sender() ermitteln, welcher Deiner QTcpSockets das readyRead ausgeloest hat.
-
Danke, werds dann später ausprobieren.
-
hat gut geklappt, danke