Changed file structure and added to maven project

main
Victor Hans-Georg Waitz 2025-10-21 16:20:25 +02:00
parent 61017aee73
commit f1931d76a0
13 changed files with 111 additions and 0 deletions

View File

@ -8,3 +8,6 @@
/target/ /target/
/.apt_generated/ /.apt_generated/
/.apt_generated_tests/ /.apt_generated_tests/
/.idea
/vs.pu01/target

View File

@ -0,0 +1,41 @@
package vs;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
// Discovery-Responder (ähnlich DHCP-Verhalten, aber minimal):
// - Hört auf UDP/8888 und akzeptiert Broadcasts
// - Antwortet mit leerem UDP-Paket direkt an den Absender
// - Client kann aus der Quell-IP der Antwort die Server-IP ermitteln
public class DiscoveryServer implements Runnable {
private final int port;
public DiscoveryServer(int port) {
this.port = port;
}
@Override
public void run() {
try (DatagramSocket discoverySocket = new DatagramSocket(port)) {
discoverySocket.setReuseAddress(true);
discoverySocket.setBroadcast(true);
byte[] buffer = new byte[256];
while (true) {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
discoverySocket.receive(packet);
InetAddress clientAddress = packet.getAddress();
int clientPort = packet.getPort();
System.out.println("DISCOVERY from " + clientAddress.getHostAddress() + ":" + clientPort);
byte[] reply = new byte[0]; // leere Antwort
DatagramPacket response = new DatagramPacket(reply, reply.length, clientAddress, clientPort);
discoverySocket.send(response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,17 @@
package vs;
// Einstiegspunkt der Anwendung:
// - Startet zwei Threads: Syslog-UDP-Server (Port 514) und Discovery-Server (Port 8888)
// - Erfüllt die Vorgaben: UDP-only, keine TLS, zwei Sockets, Konsolen-Ausgabe
public class Main {
private static final int SYSLOG_PORT = 514; // Standard-Syslog-Port (UDP)
private static final int DISCOVERY_PORT = 8888; // Port für Auto-Discovery
public static void main(String[] args) {
System.out.println("Syslog server is running on UDP/514 and discovery on UDP/8888...");
// Thread 1: Empfängt Syslog-Nachrichten und druckt Sender-IP + Nachricht
new Thread(new SyslogUdpServer(SYSLOG_PORT), "syslog").start();
// Thread 2: Beantwortet Broadcast-Anfragen und verrät so die Server-IP
new Thread(new DiscoveryServer(DISCOVERY_PORT), "discovery").start();
}
}

View File

@ -0,0 +1,50 @@
package vs;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
// UDP-Syslog-Empfänger:
// - Hört auf Port 514 (UDP), kein TLS
// - Prüft maximale Nachrichtenlänge (hier 1024 Bytes, RFC 5426 Empfehlung)
// - Gibt pro Nachricht die Absender-IP:Port und den Text auf der Konsole aus
public class SyslogUdpServer implements Runnable {
private final int port;
// Maximale Länge (vereinfachte Vorgabe; UDP-Empfänger sollten ~1024 Bytes unterstützen)
private static final int MAX_MESSAGE_LENGTH = 1024;
public SyslogUdpServer(int port) {
this.port = port;
}
@Override
public void run() {
// Socket öffnen und auf allen Interfaces an Port 514 lauschen
try (DatagramSocket syslogSocket = new DatagramSocket(port)) {
syslogSocket.setReuseAddress(true); // erlaubt schnelles Neu-Starten
byte[] buffer = new byte[MAX_MESSAGE_LENGTH + 1]; // +1 als einfache Oversize-Erkennung
while (true) {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
syslogSocket.receive(packet); // UDP-Paket empfangen
int len = packet.getLength();
InetAddress clientAddress = packet.getAddress();
// Zu lange Nachrichten verwerfen (Aufgabenforderung: Länge prüfen)
if (len > MAX_MESSAGE_LENGTH) {
System.err.println("Dropped oversized UDP syslog (" + len + " > " + MAX_MESSAGE_LENGTH
+ ") from " + clientAddress.getHostAddress() + ":" + packet.getPort());
continue;
}
// Nachricht decodieren und mit Sender-Info ausgeben
String message = new String(packet.getData(), 0, len).trim();
System.out.println("SYSLOG from " + clientAddress.getHostAddress()
+ ":" + packet.getPort() + " -> " + message);
}
} catch (Exception e) {
// Einfaches Fehler-Logging auf die Konsole
e.printStackTrace();
}
}
}