Synapse - Subnet-Scanner, Threads

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

Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

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_

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse - Subnet-Scanner, Threads

Beitrag von theo »


_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

Re: Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

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

Re: Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse - Subnet-Scanner, Threads

Beitrag von theo »

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

Re: Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

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_

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse - Subnet-Scanner, Threads

Beitrag von theo »

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

Re: Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

Nein, kein writeln()

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse - Subnet-Scanner, Threads

Beitrag von theo »

_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

Re: Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

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

Re: Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

Source
Dateianhänge
subwalk.zip
Benötigt Synapse
(3.17 KiB) 68-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse - Subnet-Scanner, Threads

Beitrag von theo »

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

Re: Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

sleep blockiert scheinbar auch die Threads.
delay ebenfalls.

mfg _X_

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse - Subnet-Scanner, Threads

Beitrag von theo »

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

Re: Synapse - Subnet-Scanner, Threads

Beitrag von _X_ »

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.

Antworten