Autor Beitrag
jacinto
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 11.10.05 12:47 
Hi,
ich benötige eine API die mir alle freien Port-ID's ermittelt.

Bietet Windows eine solche an?

Gruß, Jacinto

_________________
"Imagination is more important than knowledge"
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 11.10.05 13:07 
Du meinst einen Portscanner?

Ich hab einen Thread-basierten Portscanner geschrieben! Dies ist der Quelltext daraus, der trägt das in einer Listview ein...

ausblenden volle Höhe 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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
constructor TPortScanThread.Create(uHostIP: DWord; uPort: Integer;
  uListItem: TListItem; uAborted: PBoolean; uLastScrolledThread: PInteger);
begin
  Synchronize(frmPortscanner.IncActiveThreadCount);
  Self.fHostIP := uHostIP;
  Self.fPort := uPort;
  Self.fListItem := uListItem;
  Self.fAborted := uAborted;
  Self.fLastScrolledThread := uLastScrolledThread;
  FreeOnTerminate := True;
  inherited Create(False);
  Priority := tpLower;
end;

destructor TPortScanThread.Destroy;
begin
  Synchronize(frmPortscanner.DecActiveThreadCount);
  Synchronize(frmPortscanner.IncFinishedThreadCount);
  inherited;
end;

procedure TPortScanThread.Execute;
var
  s: TSocket;
  ret: Integer;
  saddr: SOCKADDR_IN;
begin
  if Self.fAborted^ then
    Exit;

  Self.fListItem.Caption := IntToStr(Self.fPort);

  { Socket erstellen }
  s := Socket(AF_INET, SOCK_STREAM, 0);
  { Socket konnte nicht erstellt werden, und raus }
  if(s = INVALID_SOCKET) then
  begin
    Self.fListItem.SubItems.Add('Fehler');
    Exit;
  end;
  { Struktur initialisieren }
  ZeroMemory(@saddr, sizeof(SOCKADDR_IN));
  saddr.sin_family := AF_INET;
  saddr.sin_addr.S_addr := ntohl(Self.fHostIP);
  saddr.sin_port := htons(Self.fPort);
  { verbinden }
  ret := connect(s, saddr, sizeof(saddr));
  { auswerten }
  if (ret = SOCKET_ERROR) then
    Self.fListItem.SubItems[0] := 'geschlossen'
  else
    Self.fListItem.SubItems[0] := 'offen';
end;

Die Synchronisation und so kannst du natürlich weglassen, wenn du das nicht threadbasiert machen willst. Das wäre aber empfehlenswert, weil es sonst EEWIIG dauert.

Der Aufruf als Thread geht dann so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
//oben in der Formulardefinition:
    ScanCancelled: Boolean;
    LastScrolledThread: Integer;

//Und dann für den Aufruf:
  TPortScanThread.Create(dwIP, i, tmpItem, 
    @Self.ScanCancelled, @Self.LastScrolledThread);

Bei mir hängt da natürlich noch mehr dran: Fortschrittsanzeige, Anzahl der laufenden Threads, ...
Da kann also manches auch raus, aber falls du auch Threads verwenden willst, könntest du das benutzen wollen, deshalb hab ich alles dringelassen...

Na ja, und woher der Quelltext kam: Von Luckie, aus seinem Non-VCL Scanner, aber mit Non-VCL konnte ich bei 20 Formularen nichts mit anfangen, hier fast dasselbe nur für VCL...
Original: www.delphipraxis.net...191f336b30a14b7d0cb2
jacinto Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 11.10.05 14:15 
Hallo jaenicke,

ja, einen Portscanner.

Danke für den Code, aber diese Variante (Try/Fail) hab ich schon.

Ich suche eine saubere API-Lösung.


Vielen Dank, jacinto

_________________
"Imagination is more important than knowledge"
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Di 11.10.05 15:01 
assarbad.net -> fastscan

_________________
es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...