Enhance logging in WebSocket server: Add detailed logging for TLS initialization, TCP connection acceptance, and WebSocket handshake processes. Improve error messages to provide clearer feedback on potential issues, enhancing overall server diagnostics and user awareness.

This commit is contained in:
Torsten Schulz (local)
2026-01-12 16:46:30 +01:00
parent 5f55aeea99
commit 40df17ee91

View File

@@ -238,7 +238,10 @@ impl WebSocketServer {
self.cert_path.as_deref(), self.cert_path.as_deref(),
self.key_path.as_deref(), self.key_path.as_deref(),
) { ) {
Ok(acc) => Some(acc), Ok(acc) => {
println!("[WebSocketServer] TLS erfolgreich initialisiert. Server akzeptiert wss:// Verbindungen.");
Some(acc)
}
Err(err) => { Err(err) => {
eprintln!( eprintln!(
"[WebSocketServer] TLS-Initialisierung fehlgeschlagen, starte ohne SSL: {err}" "[WebSocketServer] TLS-Initialisierung fehlgeschlagen, starte ohne SSL: {err}"
@@ -250,6 +253,7 @@ impl WebSocketServer {
} }
} }
} else { } else {
println!("[WebSocketServer] TLS deaktiviert. Server akzeptiert nur ws:// Verbindungen (nicht wss://).");
None None
}; };
@@ -300,48 +304,75 @@ async fn run_accept_loop(
tls_acceptor: Option<TlsAcceptor>, tls_acceptor: Option<TlsAcceptor>,
) { ) {
let listener = match TcpListener::bind(&addr).await { let listener = match TcpListener::bind(&addr).await {
Ok(l) => l, Ok(l) => {
println!("[WebSocketServer] Erfolgreich gebunden an {}", addr);
l
}
Err(e) => { Err(e) => {
eprintln!("[WebSocketServer] Fehler beim Binden an {}: {}", addr, e); eprintln!("[WebSocketServer] FEHLER: Konnte nicht an {} binden: {}", addr, e);
eprintln!("[WebSocketServer] Mögliche Ursachen: Port bereits belegt, keine Berechtigung, oder Firewall blockiert.");
running.store(false, Ordering::SeqCst); running.store(false, Ordering::SeqCst);
return; return;
} }
}; };
println!("[WebSocketServer] Lauscht auf {}", addr); println!("[WebSocketServer] Lauscht auf {} (TLS: {})", addr, tls_acceptor.is_some());
// Heartbeat: Logge regelmäßig, dass der Server läuft
let mut heartbeat_interval = interval(TokioDuration::from_secs(300)); // Alle 5 Minuten
let server_start = std::time::Instant::now();
while running.load(Ordering::SeqCst) { while running.load(Ordering::SeqCst) {
let (stream, peer) = match listener.accept().await { tokio::select! {
Ok(v) => v, // Heartbeat: Logge alle 5 Minuten, dass der Server läuft
Err(e) => { _ = heartbeat_interval.tick() => {
eprintln!("[WebSocketServer] accept() fehlgeschlagen: {}", e); let uptime = server_start.elapsed().as_secs();
continue; println!("[WebSocketServer] Heartbeat: Server läuft seit {} Sekunden auf {} (TLS: {})",
uptime, addr, tls_acceptor.is_some());
} }
}; // Neue Verbindung akzeptieren
result = listener.accept() => {
match result {
Ok((stream, peer)) => {
let peer_addr = peer; let peer_addr = peer;
let rx = tx.subscribe(); let rx = tx.subscribe();
let registry_clone = registry.clone(); let registry_clone = registry.clone();
let ws_log_clone = ws_log.clone(); let ws_log_clone = ws_log.clone();
let tls_acceptor_clone = tls_acceptor.clone(); let tls_acceptor_clone = tls_acceptor.clone();
tokio::spawn(async move { tokio::spawn(async move {
if let Some(acc) = tls_acceptor_clone { if let Some(acc) = tls_acceptor_clone {
match acc.accept(stream).await { println!("[WebSocketServer] Neue TCP-Verbindung von {} (TLS-Handshake wird durchgeführt...)", peer_addr);
Ok(tls_stream) => { match acc.accept(stream).await {
handle_connection(tls_stream, peer_addr, rx, registry_clone, ws_log_clone) Ok(tls_stream) => {
.await println!("[WebSocketServer] TLS-Handshake erfolgreich für {}", peer_addr);
handle_connection(tls_stream, peer_addr, rx, registry_clone, ws_log_clone)
.await
}
Err(err) => {
eprintln!(
"[WebSocketServer] TLS-Handshake fehlgeschlagen ({peer_addr}): {err}"
);
eprintln!(
"[WebSocketServer] Mögliche Ursachen: Ungültiges Zertifikat, unsupported Cipher, oder Client verwendet ws:// statt wss://"
);
}
}
} else {
println!("[WebSocketServer] Neue TCP-Verbindung von {} (ohne TLS)", peer_addr);
handle_connection(stream, peer_addr, rx, registry_clone, ws_log_clone).await;
}
});
} }
Err(err) => { Err(e) => {
eprintln!( eprintln!("[WebSocketServer] accept() fehlgeschlagen: {}", e);
"[WebSocketServer] TLS-Handshake fehlgeschlagen ({peer_addr}): {err}" // Kurz warten, um CPU-Last zu reduzieren bei wiederholten Fehlern
); tokio::time::sleep(TokioDuration::from_millis(100)).await;
} }
} }
} else {
handle_connection(stream, peer_addr, rx, registry_clone, ws_log_clone).await;
} }
}); }
} }
} }
@@ -355,14 +386,18 @@ async fn handle_connection<S>(
S: AsyncRead + AsyncWrite + Unpin + Send + 'static, S: AsyncRead + AsyncWrite + Unpin + Send + 'static,
{ {
let ws_stream = match accept_async(stream).await { let ws_stream = match accept_async(stream).await {
Ok(ws) => ws, Ok(ws) => {
println!("[WebSocketServer] WebSocket-Handshake erfolgreich für {}", peer_addr);
ws
}
Err(e) => { Err(e) => {
eprintln!("[WebSocketServer] WebSocket-Handshake fehlgeschlagen ({peer_addr}): {e}"); eprintln!("[WebSocketServer] WebSocket-Handshake fehlgeschlagen ({peer_addr}): {e}");
eprintln!("[WebSocketServer] Mögliche Ursachen: Client sendet kein WebSocket-Request, falscher Upgrade-Header, oder Protokoll-Mismatch");
return; return;
} }
}; };
println!("[WebSocketServer] Neue Verbindung von {}", peer_addr); println!("[WebSocketServer] Neue WebSocket-Verbindung etabliert von {}", peer_addr);
let (mut ws_sender, mut ws_receiver) = ws_stream.split(); let (mut ws_sender, mut ws_receiver) = ws_stream.split();