Entwickler-Ecke
Internet / Netzwerk - Port scan
the_immortal - Do 13.10.05 11:51
Titel: Port scan
Mit der folgenden Funktion finde ich die zu einem bestimmten Host gehörende IP:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function TForm1.gethostip(host: String): String; var SockAddr: TSockAddrIn; begin
SockAddr.sin_addr.S_addr := Longint(PLongint(gethostbyname(PChar(host))^.h_addr^)^); result := inet_ntoa(SockAddr.sin_addr);
end; |
Das funktionier eigentlich auch ganz gut bis ein host verwendet wird, der nicht existiert dann erhalte ich eine AccessViolation, ich habe es mit try versucht abzufangen funktioniert jedoch nicht.
Bin ein Delphi-Noob und habe seit 1 Jahr nicht mehr Delphi programmiert ;(, wie kann ich den Error abfangen?
the_immortal - Do 13.10.05 11:59
mit der folgenden Funktion schaue ich dann ob der Port einer bestimmten IP online ist oder offline:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function TForm1.online(host, port: String): Boolean; begin tcpClient1.RemoteHost := host; tcpClient1.RemotePort := port; tcpClient1.Active := true;
if tcpClient1.Connected = true then begin result := true; end else begin result := false; end;
tcpClient1.Active := false;
end; |
jedoch jedes mal bei der abfrage bleibt das Form kurz stehen, ist also lahmgelegt.
Wie kann man das ändern?
PS: Mir ist aufgefallen, das es nur ruckelt / kurz stoppt, wenn der jeweilige Port des Hosts offline, respektiv nicht offen ist! Das Ruckeln ist nur ganz leicht wenn der Port offen ist!
Narses - Do 13.10.05 12:53
Moin!
Mach einen Thread draus. :wink: Tutorials gibt´s dazu genug hier.
cu
Narses
the_immortal - Do 13.10.05 13:03
Narses hat folgendes geschrieben: |
Moin!
Mach einen Thread draus. :wink: Tutorials gibt´s dazu genug hier.
cu
Narses |
Das hilft mir auch nicht wirklich weiter :(
retnyg - Do 13.10.05 13:05
Titel: Re: Port scan
the_immortal hat folgendes geschrieben: |
| Das funktionier eigentlich auch ganz gut bis ein host verwendet wird, der nicht existiert dann erhalte ich eine AccessViolation, ich habe es mit try versucht abzufangen funktioniert jedoch nicht. |
nimm die funktion aus meiner
RETPING unit, die funktioniert.
bei
SUBNET SCANNER siehst du, wie man das mit einem thread einfach macht.
Narses - Do 13.10.05 13:06
Moin!
Du hast gefragt, wie man das Blockieren des Hauptthreads ändern kann; nun, eben mit einem weiteren Thread. Was hilft da nicht weiter? Mach Luckies Thread-Tut, dann weist du, wie man das coden kann.
cu
Narses
the_immortal - Do 13.10.05 14:21
Narses hat folgendes geschrieben: |
Moin!
Du hast gefragt, wie man das Blockieren des Hauptthreads ändern kann; nun, eben mit einem weiteren Thread. Was hilft da nicht weiter? Mach Luckies Thread-Tut, dann weist du, wie man das coden kann.
cu
Narses |
sorry, hab dich total falsch verstanden, ich dachte an ein Forum-Thread :P, sry!
PS: Merci für den Tipp
the_immortal - Do 13.10.05 15:28
Ich habe jetzt ein TThread Objekt erstellt, in welchem ich die Abfragen mache.
Mit einem Timer rufe ich das Thread wie folgt alle 5 sekunden auf
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.tmrDBTimer(Sender: TObject); var Q : thrCheck; begin
Q := thrCheck.Create(false); Q.FreeOnTerminate := true;
end; |
Es scheint genauso zu funktionieren wie zuvor, leider wird die Applikation immer noch kurz unterbrochen, vielleicht habe ich etwas übersehen, bezüglich des Threads ???
Narses - Do 13.10.05 15:33
Moin!
Und wenn du noch den Thread-Code hier reinstellst, könnte man sogar was dazu sagen... :roll: :wink:
cu
Narses
the_immortal - Do 13.10.05 15:39
zu Befehl:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure thrCheck.Execute; begin
Synchronize(DoIt);
end;
procedure thrCheck.DoIt; var ipHost1, ipHost2: String; begin
ipHost1 := gethostip2(strHost1); ipHost2 := gethostip2(strHost2);
end;
function thrCheck.gethostip2(host: String): String; var SockAddr: TSockAddrIn; HostEnt: PHostEnt; begin
HostEnt := gethostbyname(PChar(host)); if HostEnt <> nil then begin SockAddr.sin_addr.S_addr := Longint(PLongint(HostEnt^.h_addr^)^); result := inet_ntoa(SockAddr.sin_addr); end else begin result := 'error'; end; end; |
Narses - Do 13.10.05 16:00
Moin!
Wenn du den Code mit Synchronize() ausführst, dann landest du doch wieder im Haupt-Thread... dann nutzt dir der Thread ja wieder nix mehr.
cu
Narses
the_immortal - Do 13.10.05 16:02
Narses hat folgendes geschrieben: |
Moin!
Wenn du den Code mit Synchronize() ausführst, dann landest du doch wieder im Haupt-Thread... dann nutzt dir der Thread ja wieder nix mehr.
cu
Narses |
was müsste ich demnach tun?
einfach DoIt;?
Narses - Do 13.10.05 16:13
Moin!
Warum nicht den Code direkt ins Execute? Synchronize() brauchst du nur dann, wenn du VCL-Kompos im Thread befingern willst.
cu
Narses
the_immortal - Do 13.10.05 16:14
OK, es funktioniert nun! :)
Jedoch habe ich bemerkt, dass es machmal länger als 5sec dauert bis er den Thread dann auch wirklich ausgeführt hat!
the_immortal - Do 13.10.05 16:21
Narses hat folgendes geschrieben: |
Moin!
Warum nicht den Code direkt ins Execute? Synchronize() brauchst du nur dann, wenn du VCL-Kompos im Thread befingern willst.
cu
Narses |
Mache ich doch auch indem ich auf ein Shape zugreiffe? Oder ist ein Shape keine VCL-Komponente?
Narses - Do 13.10.05 16:23
Moin!
In dem Code oben kommt kein Shape vor, oder ich bin blind. :wink:
Aber wenn du tatsächlich ein Shape anfasst (ja, ist VCL), dann solltest du nur den Zugriff auf die Shape-Eigenschaften per Synchronize() kapseln, nicht die eigentliche Aufgabe. :wink:
cu
Narses
the_immortal - Do 13.10.05 16:30
Beim Synchronize wird das "Zeugs" im Haupt-Thread ausgeführt ist das richtig?
Narses - Do 13.10.05 16:38
Moin!
Ich weiss nicht genau, ob es wirklich IM Hauptthread ausgeführt wird (glaube ich nicht), sondern es wird abgewartet, bis sich der Hauptthread im MessageLoop befindet. Schau halt in die OH, da steht IMHO was dazu.
cu
Narses
the_immortal - Do 13.10.05 16:43
Um den Port zu scannen verwende ich die folgenden paar Zeilen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| tcpClient1.RemoteHost := host; tcpClient1.RemotePort := port; tcpClient1.Active := true;
if tcpClient1.Connected = true then begin result := true; end else begin result := false; end;
tcpClient1.Active := false; tcpClient1.Close; |
Wenn ich den Port öffne und ich die Funktion ausführe geht es relativ schnell bis er merkt, das er offen ist, jedoch wenn ich den Port schliesse, dauert es eine Ewigkeit. Starte ich das Programm mit der ich die Funktion aufrufe neu ist der Port sofort als offline ersichtlich (der Port ist wirklich geschlossen, irgenwie scheinen meine Zeilen nicht ganz auszureichen um das zu merken :()
retnyg - Do 13.10.05 16:45
wärst du meinen links gefolgt hättest jetzt schon eine funktionierende anwendung und müsstest dich nicht mit dem tthread objekt rumärgern :roll:
the_immortal - Do 13.10.05 17:11
retnyg hat folgendes geschrieben: |
| wärst du meinen links gefolgt hättest jetzt schon eine funktionierende anwendung und müsstest dich nicht mit dem tthread objekt rumärgern :roll: |
ein Teil konnte ich gut gebrauch, jedoch habe ich ein bisschen Mühe das zu verstehen (ME := Anfänger)
PS: ich habe keine Funktion gefunden wo ich einen Speziellen Port scannen kann?
retnyg - Do 13.10.05 17:27
pack einfach deine scanfunktion in eine prozedur, die du mit CreateThread als thread startest.
auf
http://assarbad.net findest du einen multithreaded portscanner mit source
the_immortal - Do 13.10.05 17:28
Das Problem hat sicher erledigt!
PS: Was ist der vorteil von einem TThread? Mehr Möglichkeiten?
retnyg - Do 13.10.05 17:33
the_immortal hat folgendes geschrieben: |
| PS: Was ist der vorteil von einem TThread? Mehr Möglichkeiten? |
bei nem tthread kannst du deine variablen ganz normal übergeben, mit der api musst du das alles in einen record packen und nen zeiger drauf an deine prozedur übergeben. ausserdem musst du wie ein luchs aufpassen dass keine speicherbereiche von verschiedenen threads beschrieben werden (stichwort
CRITICALSECTIONS )
the_immortal - Do 13.10.05 18:23
Schein als hätte ich vielleicht genau so ein Problem!
Ich verändere die Farbe eines Shapes, jedoch wird die Farbe erst aktualisiert, wenn das Form aktiv ist und ich ein weiteres Form öffne und dann schliesse! Ich habe es auch schon mit Repaint und Refresh versucht, funktioniert nicht!
PS: Ganz selten und sehr unberechenbar bekomme ich eine EInvalidOperation with message 'Canvas does not allow drawing'
Wie kann ich das lösen?
the_immortal - Do 13.10.05 19:27
Ich habe es jetzt noch mit der BeginThread Variante versucht, habe jedoch genau dasselbe Problem, ich muss nachdem Das Form1 den focus verloren hat im MenuList herumklicken, dass die Farbe des Shapes wirklich aktualisiert wird!
retnyg - Sa 15.10.05 19:02
probier mal was ala Menulist.Update, Paint, RePaint, Refresh oder so ähnlich
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!