Problem mit QSocketDevice

Alles rund um die Programmierung mit Qt
Antworten
FlowJo
Beiträge: 3
Registriert: 5. April 2008 11:55

Problem mit QSocketDevice

Beitrag von FlowJo »

Hallo zusammen!

Ich habe ein komisches Problem mit QSocketDevice. Ich benutze QSocketDevice sowohl auf der Server-Seite, als auch auf der Client-Seite. Um auf die Socket-Events reagieren zu können, benutze ich QSocketNotifier...so weit, so gut. Funktioniert alles prima, bis auf ein großes Problem. Wenn ich versuche , Daten zu übertragen, deren Länge > 512 Bytes sind bekomme, verhält sich der Server sehr mysteriöus. Das read-Event wird korrekt angezeigt und die Daten können auch vom Socket gelesen werden. Nachdem ich nun die Daten gelesen habe, wird weiterhin ein read-Event ausgelöst, obwohl keine Daten vorliegen. Wenn ich versuche, die Daten mit readBlock zu lesen, erhalte ich -1 - wohl ein Fehler. Wenn ich aber den Fehler abfrage, sagt er mir, dass kein Fehler aufgetreten ist. Der Server kann zwar noch Daten empfangen, irgendwann aber (ich hab noch nicht herausbekommen, wann genau), empfängt er auf dem Socket keine Daten mehr obwohl die Verbindung noch aktiv ist (sagen zumindest Server und Client). Die Qt-Version ist 3.3.8. Hat jemand schon einmal ähnliche Erfahrungen gemacht? Ich bin grade echt am verzweifeln...

Gruß
FlowJo
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Im Falle des Verzweifeln ist es immer gut ein weiteres Programm mit minimal Code zu schreiben um es zu testen und evtl. um den Code in einem Hilfeforum zu posten. :)
FlowJo
Beiträge: 3
Registriert: 5. April 2008 11:55

Beitrag von FlowJo »

Ok, habe jetzt mal eine kleine Testklasse geschrieben. Auch hier tritt der Fehler auf. Sobald ich mehr als 512 Bytes übertrage, reagiert der Socket nciht mehr.

Header:

Code: Alles auswählen

#include <qobject.h>
#include <vector>
class QSocketNotifier;
class QSocketDevice;

class SocketDeviceTester : public QObject
{
	Q_OBJECT
public:
	SocketDeviceTester();
	~SocketDeviceTester();

public:
	void			start();

private:
	QPtrList<QSocketNotifier>	 m_lstNotifiers;
	std::vector<QSocketDevice*>	m_lstClients;
	QSocketDevice*				m_pSocketDevice;

public slots:
	void slotRead(int h);
	void slotWrite(int h);
	void slotOpen();
	void slotClose(int h);
};
Implementierung:

Code: Alles auswählen

#include "SocketDeviceTester.h"
#include <qsocketnotifier.h>
#include <qsocketdevice.h>

SocketDeviceTester::SocketDeviceTester()
{
	m_lstNotifiers.setAutoDelete(true);
	m_pSocketDevice = new QSocketDevice();
}

SocketDeviceTester::~SocketDeviceTester()
{
	m_lstNotifiers.clear();

	for (int i = 0; i < m_lstClients.size(); i++)
		delete m_lstClients[i];
	
	m_lstClients.clear();

	delete m_pSocketDevice;
}

void SocketDeviceTester::start()
{
	m_pSocketDevice->bind(QHostAddress("localhost"),2807);
	m_pSocketDevice->listen(50);
	
	QSocketNotifier* notifier = new QSocketNotifier(m_pSocketDevice->socket(),QSocketNotifier::Read);
	QObject::connect (notifier,SIGNAL(activated (int)),this,SLOT (slotRead (int))) ;
	m_lstNotifiers.append(notifier);
}

void SocketDeviceTester::slotRead(int h)
{
	//new connection?
	if( h == m_pSocketDevice->socket() )
	{
		QSocketDevice* pDevice = new QSocketDevice(m_pSocketDevice->accept(),QSocketDevice::Stream);

		QSocketNotifier* notifier = new QSocketNotifier(pDevice ->socket(),QSocketNotifier::Read);
		QObject::connect (notifier,SIGNAL(activated (int)),this,SLOT (slotRead (int))) ;
		m_lstNotifiers.append(notifier);

		m_lstClients.push_back(pDevice);

		m_pSocketDevice->listen(50);
	}
	else
	{
		bool found = false;
		for (int i = 0; i < m_lstClients.size(); i++)
		{
			if( m_lstClients[i]->socket() == h )
			{
//sind mehr als 512 bytes im Array, kommt noch einmal ein read-Event, wobei der Array dann die Größe 0 hat und kein weiteres Senden möglich ist!
				//read on socket...
				QByteArray receivedBytes = m_lstClients[i]->readAll();

				QString strResult = "size: " + QString::number(receivedBytes.count());
				for (int i = 0; i < receivedBytes.size(); i++)
					strResult += receivedBytes[i];
				
				qDebug(strResult);			
				
				found = true;
			}
		}

		if( !found )
			qDebug("Socket handle not found! - %d",h);			

	}
}

void SocketDeviceTester::slotWrite(int h)
{
}

void SocketDeviceTester::slotClose(int h)
{
}

void SocketDeviceTester::slotOpen()
{
}

Der Code sollte kompillierbar sein :-) Vielleicht könnt ihr es ja mal bei euch testen. Vielen Dank schon mal im Voraus!

Gruß

FlowJo
FlowJo
Beiträge: 3
Registriert: 5. April 2008 11:55

Beitrag von FlowJo »

Hat niemand eine Idee, woran es liegen könnte?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn es Qt4 wäre hätte ich eine Idee, aber Qt3 - ist so alt das habe ich gar nicht mehr wirklich in Gebrauch...

btw: Warum diese Konstruktion?

Code: Alles auswählen

   QPtrList<QSocketNotifier>    m_lstNotifiers;
   std::vector<QSocketDevice*>   m_lstClients;
Oder gibt es QVector in Qt3 noch nicht?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten