Seite 1 von 1

Problem mit QSocketDevice

Verfasst: 5. April 2008 12:21
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

Verfasst: 5. April 2008 13:35
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. :)

Verfasst: 5. April 2008 14:51
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

Verfasst: 8. April 2008 16:35
von FlowJo
Hat niemand eine Idee, woran es liegen könnte?

Verfasst: 8. April 2008 17:27
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?