diff --git a/vs.pu01/src/main/java/vs/Client.java b/vs.pu01/src/main/java/vs/Client.java index af8aa47..ade898b 100644 --- a/vs.pu01/src/main/java/vs/Client.java +++ b/vs.pu01/src/main/java/vs/Client.java @@ -5,37 +5,94 @@ import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketAddress; +import java.util.ArrayList; + +import javax.print.attribute.standard.Severity; + +import vs.AsciiChars.L032; +import vs.AsciiChars.L048; +import vs.AsciiChars.L128; +import vs.AsciiChars.L255; +import vs.SyslogMessage.Facility; +import vs.SyslogMessage.TextMessage; public class Client { private static final int BUFSIZE = 512; + + private static final String BROADCAST_ADDRESS = "255.255.255.255"; + private static final int DISCOVERY_PORT = 8888; + private static final int SYSLOG_PORT = 514; + + static DatagramPacket packetOutDisover = new DatagramPacket(new byte[BUFSIZE], BUFSIZE); + static DatagramPacket packetInOffer = new DatagramPacket(new byte[BUFSIZE], BUFSIZE); + static DatagramPacket packetOutRequest = new DatagramPacket(new byte[BUFSIZE], BUFSIZE); + static DatagramPacket packetInAcknowledge = new DatagramPacket(new byte[BUFSIZE], BUFSIZE); + + static DatagramPacket packetOutSyslog = new DatagramPacket(new byte[BUFSIZE], BUFSIZE); + public static void main(String[] args) { try (DatagramSocket socket = new DatagramSocket()) { socket.setBroadcast(true); - //? Get Server IP - String message = "DISCOVER_SERVERS"; - byte[] buffer = message.getBytes(); + //? SEND DISOVERY + String messageString = "DISCOVER"; + byte[] message = messageString.getBytes(); - InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255"); - int discoveryPort = 8888; + packetOutDisover.setAddress(InetAddress.getByName(BROADCAST_ADDRESS)); + packetOutDisover.setPort(DISCOVERY_PORT); + packetOutDisover.setData(message); + packetOutDisover.setLength(message.length); - DatagramPacket packetOutDisover = new DatagramPacket(buffer, buffer.length, broadcastAddress, discoveryPort); socket.send(packetOutDisover); - //? Got server IP - DatagramPacket packetIn = new DatagramPacket(new byte[BUFSIZE], BUFSIZE); - socket.receive(packetIn); + //? GET OFFER + SEND REQUEST + socket.receive(packetInOffer); + String receivedOffer = new String(packetInOffer.getData(), 0, packetInOffer.getLength()); + System.out.println("Received Offer: " + receivedOffer); + + messageString = "REQUEST"; + message = messageString.getBytes(); - System.out.println("Recieved Server IP " + packetIn.getSocketAddress()); + packetOutRequest.setAddress(packetInOffer.getAddress()); + packetOutRequest.setPort(DISCOVERY_PORT); + packetOutRequest.setData(message); + packetOutRequest.setLength(message.length); + + socket.send(packetOutRequest); + + + //? GET ACKNOWLEDGE + socket.receive(packetInAcknowledge); + String receivedAckowledge = new String(packetInAcknowledge.getData(), 0, packetInAcknowledge.getLength()); + System.out.println("Received Acknowledge: " + receivedAckowledge); + InetAddress syslogServerAddress = packetInAcknowledge.getAddress(); + + + + //? SEND SYSLOG + System.out.println("Recieved Server IP " + syslogServerAddress); DatagramPacket packetOutSyslog = new DatagramPacket(new byte[BUFSIZE], BUFSIZE); - packetOutSyslog.setAddress(packetIn.getAddress()); - int syslogPort = 514; - packetOutSyslog.setPort(syslogPort); + packetOutSyslog.setAddress(syslogServerAddress); + packetOutSyslog.setPort(SYSLOG_PORT); + + TextMessage textMessage = new TextMessage("message"); + + SyslogMessage syslogMessage = new SyslogMessage( + SyslogMessage.Facility.USER, + SyslogMessage.Severity.INFORMATIONAL, + new L255("192.168.2.100"), + new L048("java"), + new L128("1"), + new L032("1"), + new StructuredData(new ArrayList<>()), + textMessage + ); + - String syslogMessage = formatSyslogMessage(message); - byte[] syslogMessageBytes = syslogMessage.getBytes(); + String syslogMessageString = syslogMessage.toString(); + byte[] syslogMessageBytes = syslogMessageString.getBytes(); packetOutSyslog.setData(syslogMessageBytes); packetOutSyslog.setLength(syslogMessageBytes.length); @@ -48,23 +105,4 @@ public class Client { e.printStackTrace(); } } - - private static String formatSyslogMessage(String message) { - // Basic RFC 5424 format without structured data - // TIMESTAMP HOSTNAME APPNAME PID MESSAGEID [STRUCTURED-DATA] MSG - // Since you ignore structured data, we skip that part - - int facility = 16; // local0 - int severity = 6; // informational - int pri = (facility * 8) + severity; - - String timestamp = java.time.Instant.now().toString(); - String hostname = "test-client"; - String appName = "SyslogTest"; - String procId = "12345"; - String msgId = "TEST001"; - - return String.format("<%d>1 %s %s %s %s %s - %s", - pri, timestamp, hostname, appName, procId, msgId, message); - } } diff --git a/vs.pu01/src/main/java/vs/DiscoveryServer.java b/vs.pu01/src/main/java/vs/DiscoveryServer.java index ad46f14..973791f 100644 --- a/vs.pu01/src/main/java/vs/DiscoveryServer.java +++ b/vs.pu01/src/main/java/vs/DiscoveryServer.java @@ -4,11 +4,12 @@ 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 static final int BUFSIZE = 512; + + DatagramPacket packetInDiscover = new DatagramPacket(new byte[BUFSIZE], BUFSIZE); + private final int port; public DiscoveryServer(int port) { @@ -18,8 +19,9 @@ public class DiscoveryServer implements Runnable { @Override public void run() { System.out.println("Discovery running on " + port); + try (DatagramSocket discoverySocket = new DatagramSocket(port)) { - discoverySocket.setReuseAddress(true); + // discoverySocket.setReuseAddress(true); discoverySocket.setBroadcast(true); while (true) { diff --git a/vs.pu01/src/main/java/vs/Main.java b/vs.pu01/src/main/java/vs/Main.java index 8de1c37..299fa30 100644 --- a/vs.pu01/src/main/java/vs/Main.java +++ b/vs.pu01/src/main/java/vs/Main.java @@ -1,17 +1,11 @@ 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 + private static final int SYSLOG_PORT = 514; + private static final int DISCOVERY_PORT = 8888; 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(); + new Thread(new SyslogUdpServer(SYSLOG_PORT), "syslog").start(); } } \ No newline at end of file diff --git a/vs.pu01/src/main/java/vs/Server.java b/vs.pu01/src/main/java/vs/Server.java index d1d4817..9ee4f9b 100644 --- a/vs.pu01/src/main/java/vs/Server.java +++ b/vs.pu01/src/main/java/vs/Server.java @@ -8,7 +8,7 @@ import java.util.concurrent.Executors; public class Server { - private static final int BUFFSIZE = 512; //? Maybe andere Größe + private static final int BUFFSIZE = 512; private static final ExecutorService executor = Executors.newFixedThreadPool(2); public interface PacketHandler { @@ -47,7 +47,14 @@ public class Server { static class SyslogHandler implements PacketHandler { @Override public void handlePacket(DatagramSocket socket, DatagramPacket packetIn, String serviceName) { + final int MAX_LENGTH = 2048; + if (packetIn.getLength() > MAX_LENGTH){ + return; + } + + String receivedSyslog = new String(packetIn.getData(), 0, packetIn.getLength()); + System.out.println(receivedSyslog); } } @@ -57,10 +64,24 @@ public class Server { DatagramPacket packetOut = new DatagramPacket(new byte[BUFFSIZE], BUFFSIZE); packetOut.setSocketAddress(packetIn.getSocketAddress()); - packetOut.setData(new byte[0]); - packetOut.setLength(0); - System.out.println("Found client, responding"); + String receivedDataString = new String(packetIn.getData(), 0, packetIn.getLength()); + // System.out.println("Discorvery Packet: " + receivedDataString); + + byte[] repsonseMessage; + if (receivedDataString.equals("DISCOVER")) { + repsonseMessage = "OFFER".getBytes(); + } + else if (receivedDataString.equals("REQUEST")) { + repsonseMessage = "ACKNOWLEDGE".getBytes(); + // System.out.println("Acknowledged client: " + packetIn.getSocketAddress()); + } + else { + repsonseMessage = "ERROR".getBytes(); + } + + packetOut.setData(repsonseMessage); + packetOut.setLength(repsonseMessage.length); socket.send(packetOut); } diff --git a/vs.pu01/src/main/java/vs/SyslogUdpServer.java b/vs.pu01/src/main/java/vs/SyslogUdpServer.java index df74918..890c083 100644 --- a/vs.pu01/src/main/java/vs/SyslogUdpServer.java +++ b/vs.pu01/src/main/java/vs/SyslogUdpServer.java @@ -4,13 +4,9 @@ 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) { @@ -19,20 +15,18 @@ public class SyslogUdpServer implements Runnable { @Override public void run() { - System.out.println("Syslog running on " + port); - // Socket öffnen und auf allen Interfaces an Port 514 lauschen + System.out.println("Syslog running on " + port + "\n"); 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 + syslogSocket.setReuseAddress(true); + byte[] buffer = new byte[MAX_MESSAGE_LENGTH + 1]; while (true) { DatagramPacket packet = new DatagramPacket(buffer, buffer.length); - syslogSocket.receive(packet); // UDP-Paket empfangen - System.out.println("SYSLOG from " + packet.getSocketAddress()); + syslogSocket.receive(packet); 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());