[QT4.1.0] QTcpServer: Probleme beim lesen
-
Hallo Leute,
Ich bin langsam am verzweifeln ....
Ich versuche geraden einen einfachen Tcp-Server mit QT zu erstellen, an den man Nachrichten senden und abschicken kann. Gut, das abschicken ist nicht mein Problem, aber verdammt noch mal, ich kann nicht lesen .....
Mein Kode schaut wie folgt aus:M4uTcpServer::M4uTcpServer( QHostAddress& host, quint16 port ) : m4uTcpHost( host ), m4uTcpPort( port ) { DEBUGNL( __LINE__ << ": " << __FILE__ << ": " << __func__ << " ip: " << host.toString().toStdString() << " port: " << port ); srand( time( 0 ) ); if ( !listen( m4uTcpHost, m4uTcpPort ) ) { DEBUGERR( __LINE__ << ": " << __FILE__ << ": " << __func__ ); DEBUGERR( "TcpServer can't listen!!!" ); close(); return; } connect( this, SIGNAL( newConnection() ), this, SLOT( m4uHandleClientConnection() ) ); }; M4uTcpServer::~M4uTcpServer() { DEBUGNL( __LINE__ << ": " << __FILE__ << ": " << __func__ ); }; void M4uTcpServer::m4uHandleClientConnection() { DEBUGNL( __LINE__ << ": " << __FILE__ << ": " << __func__ ); if ( hasPendingConnections() ) { DEBUGNL( "TcpServer has new client connection!" ); QTcpSocket* socket = nextPendingConnection(); QByteArray r = socket->readAll(); DEBUGNL( r.data() ); } };
Wenn ich jetzt mit nc an den Server etwas schicke, dann gelangt er zwar in die Funktion m4uHandleClientConnection(), aber anscheinend hat er da keine Client-Verbindung mehr, er liest einfach nichts.
Hab mir noch ein kleines Beispiel aus meinen Unterlagen rausgesucht das per TCP an einen Server etwas schickt, aber trotzdem will der Server nicht so wie ich will.
Kann vielleicht jemand kurz den Code anschaun was los ist, die QT Documentation zu dem Thema hab ich schon Xmal gelesen, weiss aber auch nicht mehr weiter. Ich habs auch schon ueber incommingConnection(int fd) probiert, aber da habe ich nur das gleiche problemmfg
-
Immer wieder das gleiche Problem.
Kämpfe auch grade damit.... aber in qt3schau dir mal waitForMore(-1); //vorsicht blocking aus QSocket an.
und while (canReadLine())Gruss,
Buggykite
-
Oh Gott, so einfach kann die Antwort sein!
Ich brauchte nur einsocket->waitForReadyRead( -1 );
und schon passts!
Danke!
-
Pass aber damit auf, wenn der Server die Verbindung wärend der readyRead beendet, hängst du in einer Schleife. Solltest du zB das ende des Streams kennen, hilft oftmals auch while (state() != QSocket::Closed) && (!gotten_string.endsWith("Mein_ende"))
bytesAvailible() hilft da auch
Gruss,
B