GUI gibt keine Rückmeldung

cesupa

Erfahrenes Mitglied
Hallo,

ich hab grad die Idee gehabt, einen Portscanner mit GUI zu basteln. Für die GUI hab ich FLTK und FLUID genommen. Als ich dann alles soweit hatte, wollte ich, dass während dem Scanvorgang Daten in einem Output-Multiline-Fenster ausgegeben werden:

Code:
SOCKADDR_IN addr;
SOCKET s;
int p1,p2,ip1,ip2;
char ipp[256];
string output;
char port[256];

p1=atoi(input_port1->value());                       //Eingegebene Werte einlesen
p2=atoi(input_port2->value());
ip1=ntohl(inet_addr(input_ip1->value()));
ip2=ntohl(inet_addr(input_ip2->value()));

cout<<"Port anfang: "<<p1<<" Port ende: "<<p2<<endl;

prbar1->minimum(0);                  //Progressbar konfigurieren
prbar1->maximum(100);

for(int z=ip1;z<=ip2;++z)  //IPZählschleife
{

for(int i=p1;i<=p2;++i)      //Ports werden hochgezählt
{

IntToString(i,port);          //Port wird in zeichenkette umgewandelt
addr.sin_addr.s_addr=htonl(z);                
cout<<inet_ntoa(addr.sin_addr)<<endl;   //ausgabe der derzeitigen IP
strcpy(ipp,inet_ntoa(addr.sin_addr));       //IP in char variable kopieren

s=client_init(i,htonl(z),AF_INET,SOCK_STREAM,0,false);  //Mit IP Adresse und Port verbinden
if(s==1) //Falls Fehlermeldung(Port geschlossen)
{
output=output + "Port geschlossen: " + port + " bei " + ipp + "\n"; //String Variable wird mit Daten gefüttert

}
else       //Port geöffnet
{
output=output + "Port geöffnet: " + port + " bei " + ipp + "\n";
}
close(s);               //socket schließen und WSA bereinigen für nächsten Scan

prbar1->value((p2/i)*100);  //Progressbar- fortschritt anzeiegn
out1->value(output.c_str()); /7Daten ausgeben


}
}

Die Funktion client_init() und close() sind von mir selbst geschriebene Funktionen.
Wenn ich jetzt einen Scanvorgang starte, dann werden mir die Daten nur in der Shell angezeigt, nicht aber in der Output-Box. Erst wenn der Scanvorgang beendet ist sehe ich die Daten auch in der Outputbox und die Prgressbar ist voll. Ich möchte die Daten und den Fortschritt aber schon während dem scanvorgang sehen, nicht erst nachher, wie mach ich das?

Gruß
cesupa
 
Ich will ja nicht drängen, aber hat denn wirklich keiner eine Idee? Ich möchte jetzt neue Programme auf meiner Website zum download anbieten, unter anderem auch ein Programm mit dem Dateien versenden kann. Wenn ich jetzt eine große Datei versende dann zeigt eine ProgressBar nicht den gewünschten Fortschritt an, sondern zeigt erst nachdem versenden der datei den Fortschritt an. Gibt es irgendwie so eine Art Update() Funktion bei FLTK?

Gruß
cesupa
 
Die Lösung ist ganz einfach (wenn's das ist was ich denke). Dein Programm ist nur damit beschäftigt die Daten abzuarbeiten (die Konsole scheint unabhängig vom Programm zu sein, deswegen zeigt sie die Nachricht auch an). Und erst wenn das Programm fertig ist, bekommt es wieder die gelegenheit was mit der GUI zu unternehmen.

Im Taskmanager müsste dann "keine Rückmeldung" bei deinem Prog stehen.
Ist dass der Fall, dann hilft normalerweiße ein Thread. Benutze die suche oder MSDN
 
So, hab jetzt mal einiges zu pthreads gesucht und hab gemerkt, dass pthreads scheinbar nur dann funkioniert, wenn der entsprechende code in einer Funktion gepackt ist. Ich habe jetzt aber z.B. in meinem Datei versende Programm die Routine fürs Dateiversenden und die Routine für die aktualisierung der Progressbar in einer while()-Schleife drin:

Code:
//...

int rechnung;
while(!quelle.eof()) //Datei versenden bis Datei-Ende erreicht
{
quelle.read(buf,1024);                     //datei Stückchenweise einlesen
rech+=senden(s,buf,1024,0,false);  //Datei versenden

rechnung=(rech/len)*100;

//pthread_create(&p1,NULL,pbar_1,&rechnung); //erste versuche pthread zu verwenden
//pthread_join(p1,NULL);
prbar1->value(rechnung); //Fortschritt anzeigen
}

Wenn ich die pthreads jetzt so wie oben verwenden würde, stürzt mein Programm genacu an der Stelle ab. Wie kann ich das Problem jetzt lösen?

Kennt ihr gute Tutorials (möglichst auf Deutsch) über pthreads?
Gruß
cesupa
 
So, ich habs jetzt mal mit CreateThread() probiert und hab nun das Problem, dass wenn ich über CreateThread() eine Zahl an eine Funktion übergebe und mir die Zahl über die Funktion ausgeben lasse, immer solche utopische Werte wie 229037 ausgegeben werde, obwohl ich die Zahl 0 übergeben habe.

Code:
DWORD threadid;
HANDLE hThread;
int rechnung;

rechnung=0;

hThread=CreateThread(NULL,0,pbar_1,(LPVOID)&rechnung,0,&threadid);

Funktion:
Code:
DWORD WINAPI pbar_1(LPVOID value) {

prbar1->value((int)value); //Progressbar aktualisieren
list1->add((char*)value);  //In Liste etwas ausgeben
cout<<(int)value<<endl; //hier wird der utopische Wert ausgegeben

return ((DWORD)value);
}

Wo ist da jetzt der Fehler drin?

Gruß
cesupa
 
So, da ich hier anscheinend keine Antwort bekomme versuch ichs noch immer selbst und bin jetzt glaube ziemlich weiter gekommen. Ich eröffne den Thread jetzt in der Sende-Schleife und hab das Problem, das die Funktion, in dem Thread keine Berechnungen ausführt.

Code:
rech=0;

while(!quelle.eof())
{
quelle.read(buf,1024);
rech+=senden(s,buf,1024,0,false);
hThread=CreateThread(NULL,0,pbar_1,(LPVOID)rech,0,&threadid);
}

CloseHandle(hThread);

Hier die Funktion:

Code:
DWORD WINAPI pbar_1(LPVOID teil) {
int ganzes,t,erg;

t=(int)teil;
ganzes=(int)len;
erg=(t/ganzes)*100; //Prozent ausrechnen-> es wird keine Berechnug ausgeführt!!-Warum nicht?

prbar1->value(erg); //Wert an Progressbar übergeben

cout<<erg<<endl;
cout<<"Das ist teil: "<<t<<"              "<<ganzes<<endl;

return ((DWORD)teil);
}

Die variable len hab ich global übergeben.
Wenn ich das Programm jetzt starte und eine Datei versende, dann zeigt mir die Funktion die ich mit dem Thread öffne, die übergebenen Werte richtig an, jedoch wird kein Ergebnis berechnet, sprich also, das Ergebnis bleibt 0, erst zum Schluss der Senderoutine wird das Ergebnis berechnet. Woran kann das liegen?

Danke für eure Antworten, falls ihr antwortet.

Gruß
cesupa
 
Zurück