Changed file structure and added to maven project
parent
61017aee73
commit
f1931d76a0
|
|
@ -8,3 +8,6 @@
|
||||||
/target/
|
/target/
|
||||||
/.apt_generated/
|
/.apt_generated/
|
||||||
/.apt_generated_tests/
|
/.apt_generated_tests/
|
||||||
|
/.idea
|
||||||
|
/vs.pu01/target
|
||||||
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue