Du meinst einen Portscanner?
Ich hab einen Thread-basierten Portscanner geschrieben! Dies ist der Quelltext daraus, der trägt das in einer Listview ein...
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);
s := Socket(AF_INET, SOCK_STREAM, 0); if(s = INVALID_SOCKET) then begin Self.fListItem.SubItems.Add('Fehler'); Exit; end; ZeroMemory(@saddr, sizeof(SOCKADDR_IN)); saddr.sin_family := AF_INET; saddr.sin_addr.S_addr := ntohl(Self.fHostIP); saddr.sin_port := htons(Self.fPort); ret := connect(s, saddr, sizeof(saddr)); 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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| ScanCancelled: Boolean; LastScrolledThread: Integer;
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