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.
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.
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.
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.