Viele Socketverbinden irgendwie Zwischenspeichern ...

Alles rund um die Programmierung mit Qt
Antworten
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Viele Socketverbinden irgendwie Zwischenspeichern ...

Beitrag von FlorianBecker »

Hallo,

ich versuche Socketverbindungen Zwischenzuspeichern und diese, wenn ich sie benötige direkt wieder zu beschreiben, leider hängt sich dort jedes Mal das Programm auf, weil er nicht auf etwas schreiben kann, was nicht dar ist.

So sieht das aus, wenn ich bisher Sockets eintrage:

Code: Alles auswählen

QMap <QString, QTcpSocket> sockets;
sockets.insert( "name", socket>;
Und so stell ich mir vor, hier Sockets wieder zu beschreiben:

Code: Alles auswählen

QMapIterator<QString, QTcpSocket *> i( sockets );
while ( i.hasNext() ) {

  QTcpSocket *socket = i.value();
  socket -> write( xml.toUtf8().constData(), xml.length() );
}
Geht bloß nicht, stürzt eben ab. Jemand eine Idee? Evtl. ganz anderer Ansatz? Ziel ist es das der laufende Dienst alle Socketverbindungen kennt, und diesen auch wieder Daten zukommen lassen kann, wenn der Dienst will.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Ich regle das so:

Ich habe mein QTcpServer. Signal newConnection ist mit dem Slot newConnection aus meiner Server Klasse verbunden und sieht so aus:

Code: Alles auswählen

void ClientInterface::newConnection( void )
{
	while( m_pServer->hasPendingConnections() ) {
		QTcpSocket *pSocket = m_pServer->nextPendingConnection();
		Q_CHECK_PTR( pSocket );
		connect( pSocket, SIGNAL( readyRead() ), this, SLOT( readyRead() ) );
		connect( pSocket, SIGNAL( error( QAbstractSocket::SocketError ) ), this, SLOT( error( QAbstractSocket::SocketError ) ) );
	}
}
Später im readyRead Slot packe ich den Socket in eine QMap (Ist eine Art Authentifizierung du könntest in deinem Fall wohl den Socket gleich in die QMap schreiben).

Wichtig ist, dass 1. der Socket gültig initialisiert wurde, 2. ein Pointer ist da sonst der Speicher beim Verlassen der Funktion/Methode freigegeben wird (und 3. das der Socket verbunden ist). Bei 3 bin ich mir nicht 100%ig sicher.

Hoffe gehelft zu haben :)

SG Alexander
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Hi,

hatte ich genauso wie von dir beschrieben gemacht. Ging immer nicht, das Problem lag bei den Iteratoren... Wo genau? Kein Plan.

Ich habe jetzt foreach genommen und es klappt hervorragend.

Zu Punkt drei von dir, ja eine Verbindung muss bestehen.

Danke
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Funktioniert bei mir eigentlich normal:

Code: Alles auswählen

for( QMap<QString, QTcpSocket*>::Iterator it = m_ClientTable.begin(); it != m_ClientTable.end(); it++ )
...
Ist foreach eigentlich von der Performance her besser als diese Schleife? Einen Fall habe ich, da muss ich die selben Daten an alle Clients senden und da würde sich das anbieten.

SG Alexander
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Hi,

also foreach ist nur ein map von einer gewöhnlichen for Schleife.
Antworten