QThread - QTcpSocket
Verfasst: 29. Dezember 2011 20:03
Ziel:
Eine Liste aller Geräte im Heimnetzwerk die auf einem bestimmten Port ihren Dienst anbieten, also ein Portscanner.
Idee:
Per QTcpSocket versuchsweise eine Verbindung zu einem Server:Port herstellen, mit waitForConnected(timeout) abbrechen wenn keine Verbindung hergestellt werden konnte und dann den nächsten Port testen. Diese Schleife dann für jede mögliche Serveradresse in eine seperaten QThread verpacken und parallel suchen lassen.
Problem:
Der beschriebene Ablauf hat bisher problemlos funktioniert unter Linux und unter Windows7, bei einem Test mit Windows XP findet das Programm aber keinen Server mehr, sobald mehrere Threads gleichzeitig ablaufen.
Fragen:
Sind bei WindowsXP nur eine begrenzte Anzahl von QThreads möglich?
Müssen QThreads irgendwie organisiert werden?
Steckt das Problem schon in der Idee und es gibt eine bessere Methode die Liste zu generieren?
Habe ich im Code mal wieder Mist gebaut und seh den einfach nicht?
Gruß Sig
Eine Liste aller Geräte im Heimnetzwerk die auf einem bestimmten Port ihren Dienst anbieten, also ein Portscanner.
Idee:
Per QTcpSocket versuchsweise eine Verbindung zu einem Server:Port herstellen, mit waitForConnected(timeout) abbrechen wenn keine Verbindung hergestellt werden konnte und dann den nächsten Port testen. Diese Schleife dann für jede mögliche Serveradresse in eine seperaten QThread verpacken und parallel suchen lassen.
Problem:
Der beschriebene Ablauf hat bisher problemlos funktioniert unter Linux und unter Windows7, bei einem Test mit Windows XP findet das Programm aber keinen Server mehr, sobald mehrere Threads gleichzeitig ablaufen.
Fragen:
Sind bei WindowsXP nur eine begrenzte Anzahl von QThreads möglich?
Müssen QThreads irgendwie organisiert werden?
Steckt das Problem schon in der Idee und es gibt eine bessere Methode die Liste zu generieren?
Habe ich im Code mal wieder Mist gebaut und seh den einfach nicht?
Code: Alles auswählen
class ScanThread : public QThread
{
Q_OBJECT
public:
ScanThread(QString ipToScan, int pStart=1, int pStop=255, int scanWTime = 10);
QString ipNo(void);
public slots:
void run(void);
void stop(void);
void setHostName(QHostInfo hostInfo);
signals:
void found(QString ipNo, int portNo);
void hostName(QString ipNo, QString hostName);
void current(int portNo);
private:
QString ip;
QString name;
int count;
int portStart;
int portStop;
bool doStop;
int scanWaitTime;
};
Code: Alles auswählen
ScanThread::ScanThread(QString ipToScan, int pStart, int pStop, int scanWTime){
ip=ipToScan;
portStart = pStart;
portStop = pStop;
scanWaitTime = scanWTime;
name = "";
count = 0;
}
void ScanThread::run(void){
doStop = false;
int port = portStart;
QTcpSocket sock;
while ( (!doStop) && (port <= portStop) ) {
sock.connectToHost(ip,port);
if ( sock.waitForConnected(scanWaitTime) ) {
emit found(ip,port);
if ( count == 0 ) {
QHostInfo::lookupHost(ip,this,SLOT(setHostName(QHostInfo)));
}
count++;
sock.disconnectFromHost();
//sock.waitForDisconnected(10);
}
emit current(port);
port++;
}
if ( count ) {
while ( name.isEmpty() ) usleep(1000);
}
}
void ScanThread::setHostName(QHostInfo hostInfo){
name = hostInfo.hostName();
if (name.isEmpty() ) name = "---";
emit hostName(ip,name);
}
void ScanThread::stop(void){
doStop = true;
}
QString ScanThread::ipNo(void){
return ip;
}