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
Problem mit QSocketDevice
-
PeterLustig
- Beiträge: 386
- Registriert: 21. November 2007 20:07
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:
Implementierung:
Der Code sollte kompillierbar sein
Vielleicht könnt ihr es ja mal bei euch testen. Vielen Dank schon mal im Voraus!
Gruß
FlowJo
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);
};
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()
{
}
Gruß
FlowJo
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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?
Oder gibt es QVector in Qt3 noch nicht?
btw: Warum diese Konstruktion?
Code: Alles auswählen
QPtrList<QSocketNotifier> m_lstNotifiers;
std::vector<QSocketDevice*> m_lstClients;
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung