Alle Fragen zur Netzwerkkommunikation
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 12:13
Ich würde gerne einen Subnetscanner mit Threads realisieren.
Ich habe aber noch nie mit Threads gearbeitet und leider auch keine Ahnung, wo ich zu lernen Anfangen soll.
Ich habe schon einen Scanner mit Synapse gemacht. Ist aber ziemlich langsam.
Code: Alles auswählen
program subwalk; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils, CustApp { you can add units after this } , pingsend; type { TMyApplication } TMyApplication = class ( TCustomApplication) protected procedure DoRun; override; public n_sockets: array [ 1..255] of TPingSend; end ; { TMyApplication } procedure TMyApplication.DoRun ;var host: string ; tm: integer; I: integer;begin if ParamStr( 1 ) <> '' then begin host := ParamStr( 1 ) ; end else begin halt; end ; if ParamStr( 2 ) <> '' then begin tm := StrToInt( ParamStr( 2 ) ) ; end else begin halt; end ; for I:= 1 to 255 do begin n_sockets[ I] := TPingSend.Create ; try n_sockets[ I] .Timeout := tm; n_sockets[ I] .ping ( host + '.' + inttostr( I) ) ; if n_sockets[ I] .pingtime <> - 1 then begin Writeln( host + '.' + inttostr( I) + '|' + IntTostr( n_sockets[ I] .pingtime ) + '|' + inttostr( n_sockets[ I] .Timeout ) + '|' + inttostr( n_sockets[ I] .TTL ) ) ; end ; finally n_sockets[ I] .Free ; end ; end ; { add your program here } // stop program loop Terminate;end ; var Application: TMyApplication;begin Application:= TMyApplication.Create ( nil ) ; Application.Run ; Application.Free ;end .
Wäre für Hilfe Dankbar.
mfg _X_
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 13:02
Nein, noch nicht gelesen. Danke, werde es mir mal ansehen. mfg _X_
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 19:05
Ich habe mit dem Link oben einen Scanner gebastelt. Der funktioniert aber nicht ganz. Der Fehler liegt wahrscheinlich nicht in den Threads. Er findet bei mir IPs die mit 100%iger sicherheit nicht online sind. Bitte mal testen. mfg _X_ edit:// manche die Online sind findet er nicht.
Dateianhänge
subwalk.zip
Benötigt Synapse (3.01 KiB) 67-mal heruntergeladen
theo
Beiträge: 10497 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Sa 21. Feb 2009, 20:23
Häng besser bei jedem Thread das OnTerminte Ereignis ein. Dann meldet sich der Thread, wenn er fertig ist in deiner Anwendung. Das ist dann auch Threadsafe. In dessen Ereignisbehandlungsmethode der Anwendung, kannst du dann die Daten sammeln oder ausgeben. Mach noch FreeOnTerminate dann ist der Thread nachher automatisch zerstört. Zähl einfach bei jedem Thread der sich abmeldet einen Zähler runter, dann weisst du wann der letzte zurückgekommen ist.
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 21:15
Ich kann OnTerminate zwar definieren, aber wenn es aufgerufen wird kommt ein Fehler.
Code: Alles auswählen
An unhandled exception occurred at $0806245F : EInOutError : Invalid file handle $0806245F $0805AF48 $0807AD75
Wo kommt der Fehler her?
mfg _X_
theo
Beiträge: 10497 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Sa 21. Feb 2009, 21:18
K.A. writeln?
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 21:24
Nein, kein writeln()
theo
Beiträge: 10497 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Sa 21. Feb 2009, 21:26
_X_ hat geschrieben: Nein, kein writeln()
Soll ich im trüben Fischen? Ich sehe deinen Code ja nicht.
Bist du unter Linux? Dann musst du noch {$IFDEF UseCThreads} entfernen oder den CompilerSchalter mitgeben.
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 21:46
theo hat geschrieben: _X_ hat geschrieben: Dann musst du noch {$IFDEF UseCThreads} entfernen oder den CompilerSchalter mitgeben.
Der Compilerschalter ist dabei.
Ich habe hier OnTerminate definiert:
Code: Alles auswählen
for I:= 1 to 255 do begin n_threads[ I] := nThread.Create ( true ) ; n_threads[ I] .host := host + '.' + inttostr( I) ; n_threads[ I] .tm := tm; n_threads[ I] .OnTerminate := @threadterminated; n_threads[ I] .Resume ;end ;
threadterminated:
Code: Alles auswählen
procedure TMyApplication.threadterminated ( Sender: TObject) ;begin dec( z) ;end ;
z ist eine Globale Variable
mfg _X_
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 21:51
Source
Dateianhänge
subwalk.zip
Benötigt Synapse (3.17 KiB) 68-mal heruntergeladen
theo
Beiträge: 10497 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Sa 21. Feb 2009, 22:03
Also ich hab's nicht richtig getestet, aber dein Programm muss nat. warten bis die Threads zurück sind. Also z.B. writeln('schleife vorbei'); { add your program here } while z>0 do sleep(100); Die Threads führen ein Eigenleben und halten das Prog nicht auf, sich zu beenden. Dann kommen sie zurück und Mama ist nicht mehr da.
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 22:16
sleep blockiert scheinbar auch die Threads. delay ebenfalls. mfg _X_
theo
Beiträge: 10497 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Sa 21. Feb 2009, 22:56
Ja sorry, habe noch nie mit TCustomApplication gearbeitet. So müsste es gehen: while z>0 do begin CheckSynchronize(); sleep(10); end; P.S. kannst das sleep vllt. auch entfernen oder auf 1 runterschrauben. Testen.
_X_
Beiträge: 250 Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit
Beitrag
von _X_ » Sa 21. Feb 2009, 23:03
Ja, es geht. Er findet aber immer noch IPs die nicht online sind und welche die online sind findet er nicht. mfg _X_ edit:// Bei sleep(100) bringt er nur die, die da sind. Es funktioniert, ist aber zu langsam.