From f1931d76a0abc0d5b8acb794c3a63a6b04312bbc Mon Sep 17 00:00:00 2001 From: 3013050 <3013050@stud.hs-mannheim.de> Date: Tue, 21 Oct 2025 16:20:25 +0200 Subject: [PATCH] Changed file structure and added to maven project --- vs.pu01/vs.pu01/.gitignore => .gitignore | 3 ++ vs.pu01/{vs.pu01 => }/justfile | 0 vs.pu01/{vs.pu01 => }/pom.xml | 0 .../src/main/java/vs/AsciiChars.java | 0 .../src/main/java/vs/Client.java | 0 vs.pu01/src/main/java/vs/DiscoveryServer.java | 41 +++++++++++++++ vs.pu01/src/main/java/vs/Main.java | 17 +++++++ .../src/main/java/vs/Server.java | 0 .../src/main/java/vs/StructuredData.java | 0 .../src/main/java/vs/SyslogMessage.java | 0 vs.pu01/src/main/java/vs/SyslogUdpServer.java | 50 +++++++++++++++++++ .../src/test/java/vs/AsciiCharsTest.java | 0 .../src/test/java/vs/SyslogMessageTest.java | 0 13 files changed, 111 insertions(+) rename vs.pu01/vs.pu01/.gitignore => .gitignore (84%) rename vs.pu01/{vs.pu01 => }/justfile (100%) rename vs.pu01/{vs.pu01 => }/pom.xml (100%) rename vs.pu01/{vs.pu01 => }/src/main/java/vs/AsciiChars.java (100%) rename vs.pu01/{vs.pu01 => }/src/main/java/vs/Client.java (100%) create mode 100644 vs.pu01/src/main/java/vs/DiscoveryServer.java create mode 100644 vs.pu01/src/main/java/vs/Main.java rename vs.pu01/{vs.pu01 => }/src/main/java/vs/Server.java (100%) rename vs.pu01/{vs.pu01 => }/src/main/java/vs/StructuredData.java (100%) rename vs.pu01/{vs.pu01 => }/src/main/java/vs/SyslogMessage.java (100%) create mode 100644 vs.pu01/src/main/java/vs/SyslogUdpServer.java rename vs.pu01/{vs.pu01 => }/src/test/java/vs/AsciiCharsTest.java (100%) rename vs.pu01/{vs.pu01 => }/src/test/java/vs/SyslogMessageTest.java (100%) diff --git a/vs.pu01/vs.pu01/.gitignore b/.gitignore similarity index 84% rename from vs.pu01/vs.pu01/.gitignore rename to .gitignore index 0ab4aa3..70a2b84 100644 --- a/vs.pu01/vs.pu01/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ /target/ /.apt_generated/ /.apt_generated_tests/ +/.idea +/vs.pu01/target + diff --git a/vs.pu01/vs.pu01/justfile b/vs.pu01/justfile similarity index 100% rename from vs.pu01/vs.pu01/justfile rename to vs.pu01/justfile diff --git a/vs.pu01/vs.pu01/pom.xml b/vs.pu01/pom.xml similarity index 100% rename from vs.pu01/vs.pu01/pom.xml rename to vs.pu01/pom.xml diff --git a/vs.pu01/vs.pu01/src/main/java/vs/AsciiChars.java b/vs.pu01/src/main/java/vs/AsciiChars.java similarity index 100% rename from vs.pu01/vs.pu01/src/main/java/vs/AsciiChars.java rename to vs.pu01/src/main/java/vs/AsciiChars.java diff --git a/vs.pu01/vs.pu01/src/main/java/vs/Client.java b/vs.pu01/src/main/java/vs/Client.java similarity index 100% rename from vs.pu01/vs.pu01/src/main/java/vs/Client.java rename to vs.pu01/src/main/java/vs/Client.java diff --git a/vs.pu01/src/main/java/vs/DiscoveryServer.java b/vs.pu01/src/main/java/vs/DiscoveryServer.java new file mode 100644 index 0000000..2a0bcce --- /dev/null +++ b/vs.pu01/src/main/java/vs/DiscoveryServer.java @@ -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(); + } + } +} \ No newline at end of file diff --git a/vs.pu01/src/main/java/vs/Main.java b/vs.pu01/src/main/java/vs/Main.java new file mode 100644 index 0000000..00ba340 --- /dev/null +++ b/vs.pu01/src/main/java/vs/Main.java @@ -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(); + } +} \ No newline at end of file diff --git a/vs.pu01/vs.pu01/src/main/java/vs/Server.java b/vs.pu01/src/main/java/vs/Server.java similarity index 100% rename from vs.pu01/vs.pu01/src/main/java/vs/Server.java rename to vs.pu01/src/main/java/vs/Server.java diff --git a/vs.pu01/vs.pu01/src/main/java/vs/StructuredData.java b/vs.pu01/src/main/java/vs/StructuredData.java similarity index 100% rename from vs.pu01/vs.pu01/src/main/java/vs/StructuredData.java rename to vs.pu01/src/main/java/vs/StructuredData.java diff --git a/vs.pu01/vs.pu01/src/main/java/vs/SyslogMessage.java b/vs.pu01/src/main/java/vs/SyslogMessage.java similarity index 100% rename from vs.pu01/vs.pu01/src/main/java/vs/SyslogMessage.java rename to vs.pu01/src/main/java/vs/SyslogMessage.java diff --git a/vs.pu01/src/main/java/vs/SyslogUdpServer.java b/vs.pu01/src/main/java/vs/SyslogUdpServer.java new file mode 100644 index 0000000..9b67dae --- /dev/null +++ b/vs.pu01/src/main/java/vs/SyslogUdpServer.java @@ -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(); + } + } +} \ No newline at end of file diff --git a/vs.pu01/vs.pu01/src/test/java/vs/AsciiCharsTest.java b/vs.pu01/src/test/java/vs/AsciiCharsTest.java similarity index 100% rename from vs.pu01/vs.pu01/src/test/java/vs/AsciiCharsTest.java rename to vs.pu01/src/test/java/vs/AsciiCharsTest.java diff --git a/vs.pu01/vs.pu01/src/test/java/vs/SyslogMessageTest.java b/vs.pu01/src/test/java/vs/SyslogMessageTest.java similarity index 100% rename from vs.pu01/vs.pu01/src/test/java/vs/SyslogMessageTest.java rename to vs.pu01/src/test/java/vs/SyslogMessageTest.java