From 505353cd26aeb9f69edc8fa5a891bf788a7660de Mon Sep 17 00:00:00 2001 From: Dicken Date: Sat, 25 Jul 2026 09:11:02 +0200 Subject: [PATCH] round40: HTTP-Pruefung offener Ports parallelisiert (behebt sehr lange Scan-Zeiten seit vollstaendigem Portscan) --- apps/backend/src/scanner/networkScanner.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/backend/src/scanner/networkScanner.ts b/apps/backend/src/scanner/networkScanner.ts index 11086e5..bd7cf23 100644 --- a/apps/backend/src/scanner/networkScanner.ts +++ b/apps/backend/src/scanner/networkScanner.ts @@ -124,7 +124,12 @@ export async function scanDeviceServices( const found: DiscoveredService[] = []; - for (const port of openPorts) { + // Die HTTP-Abfrage je offenem Port läuft PARALLEL, nicht mehr + // nacheinander - bei bis zu 3 HTTP-Versuchen (Protokoll-Fallback + + // Titel-Wiederholung) à 2 Sekunden Timeout summierte sich das bei einem + // Gerät mit vielen offenen Ports (seit dem vollständigen 1-65535-Portscan + // deutlich häufiger) schnell auf mehrere Minuten PRO GERÄT. + async function probePort(port: number): Promise { let isHttps = port === 443 || port === 9443 || port === 8006 || port === 8443; let baseUrl = `${isHttps ? "https" : "http"}://${address}:${port}`; let probe = await probeHttp(baseUrl); @@ -150,7 +155,7 @@ export async function scanDeviceServices( // solcher Nicht-Web-Ports - die sollen NICHT als (dann meist // ausgeblendeter) Dienst-Eintrag landen, sondern komplett übersprungen // werden. "Mich interessieren doch nur Webifs." - if (probe.status === undefined) continue; + if (probe.status === undefined) return null; const software = detectSoftware({ server: probe.server, @@ -202,7 +207,7 @@ export async function scanDeviceServices( // Ladebildschirme landen als ausgeblendeter Dienst im Adminbereich. const visible = !!softwareResolved || (probe.ok && !titleIsJunkResolved); - found.push({ + return { hostname: address, url: baseUrl, https: isHttps, @@ -214,7 +219,12 @@ export async function scanDeviceServices( category: softwareResolved?.category, icon: softwareResolved?.icon, visible, - }); + }; + } + + const probeResults = await Promise.all(openPorts.map(probePort)); + for (const result of probeResults) { + if (result) found.push(result); } // Fallback für Dienste ohne bestätigtes Favicon (kein