UDP Packet empfangen funktioniert nicht.

godi

Aktives Mitglied
Hallo,
ich habe meinen Windows PC eine statische IP vergeben (192.168.140.1) und direkt ein externes Gerät (192.168.140.10) angeschlossen.
Dieses Gerät sendet UDP Pakete mit 4Byte Nutzdaten von und an Port 2020.
Mit Wireshark (am Windows PC) kann ich die Pakete sehen, dass diese auch gesendet werden:
"1","0.000000","192.168.140.10","192.168.140.1","UDP","60","2020 → 2020 Len=4"
Hex Dump
0000 98 fa 9b 6e bd 77 64 4d 70 00 e8 e7 08 00 45 00
0010 00 20 2c 53 40 00 40 11 75 1d c0 a8 8c 0a c0 a8
0020 8c 01 07 e4 07 e4 00 0c 25 f2 2f bf 01 00 00 00
0030 00 00 00 00 00 00 00 00 00 00 00 00

Mein UDP Client sieht folgend aus:
Java:
import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;

public class UDPClient {
 
    public static void main(String[] args) {
      
        String hostname = "192.168.140.1"; //"127.0.0.1";
        int port = 2020;
    
        
        try {
            InetAddress address = InetAddress.getByName(hostname);
            DatagramSocket socket = new DatagramSocket(port, address);
            socket.setReceiveBufferSize(4 * 1024);

            System.out.println("Socket open, receive Data!");
            
            while (true) {             
                byte[] buffer = new byte[4];
                DatagramPacket response = new DatagramPacket(buffer, buffer.length);               
                socket.receive(response);
 
                ByteBuffer receivedData = ByteBuffer.wrap(response.getData());
                System.out.println(receivedData.getInt());
            }           

            
        } catch (SocketTimeoutException ex) {
            System.out.println("Timeout error: " + ex.getMessage());
            ex.printStackTrace();
        } catch (IOException ex) {
            System.out.println("Client error: " + ex.getMessage());
            ex.printStackTrace();     
        
        }
        
    }
}

Der Code wird mit Eclipse gestartet, jedoch kann ich keine Pakete empfangen.
Weiß jemand warum?
Kann es sein das Eclipse irgendwas blockiert?

Testweise habe ich mir einen Server dazu geschrieben. Wenn ich die Daten über den Localhost dann sende, funktioniert es ohne Probleme.

godi
 
Eclipse eigentlich nicht, aber ggf. die Windows Firewall?

Während das Problem läuft kannst du ja mal in der Kommandozeile "netstat -p UDP -q" aufrufen - da sollte dann die IP-Adresse mit Port 2020 als lauschend auftauchen.
 
Win Firewall glaube ich nicht.
Viellmehr musst du erst mal einen request senden bevor du was empfangen kannst. Damit baust du erstmal eine Verbindung zum Server auf.

Das sollte bei UDP auch so sein.
 
Win Firewall glaube ich nicht.
Viellmehr musst du erst mal einen request senden bevor du was empfangen kannst. Damit baust du erstmal eine Verbindung zum Server auf.

Das sollte bei UDP auch so sein.
Das ist nun mal grober Unfug 🙂
Wie soll den jemand auf den Request antworten? Der muss doch auch mal erst einen Request senden bevor er den request empfangen kann.

Insbesondere ist UDP ein zustandsloses Protokoll im Gegensatz zu TCP. Da gibt es keine Verbindung die aufgebaut wird, sondern das ist Fire & Forget. Und man sieht ja an dem Wireshark Output open, dass Daten ankommen.
 
Win Firewall glaube ich nicht.
Viellmehr musst du erst mal einen request senden bevor du was empfangen kannst. Damit baust du erstmal eine Verbindung zum Server auf.

Das sollte bei UDP auch so sein.
UDP ist eine Verbindungslose Datenübertragung. Da gibt es also keinen Verbindungsaufbau. Und den request hat er ja gesendet und das sogar noch überprüft mit Wireshark.

Daher halte ich die Windows Firewall auch für sehr wahrscheinlich. Daher ggf. einfach mal einen Befehl absetzen wie:
netsh firewall add portopening UDP 2020 "UDP Port 2020"
 
Zum Thema grober unfug
Und hast Du da mal unter Datagram-Socket gelesen, was da Sache ist?

Serverseitig:
  1. Socket erstellen
  2. Socket binden
  3. warten auf Pakete
Und genau das hat er gemacht im Server.

Und der Server muss nichts senden um etwas empfangen zu können.

Dies hat der TE übrigens ja auch ausgetestet - lokal mit localhost lief es ja, was darauf hin deutet, dass der Code soweit korrekt ist.
 
Du kannst dir gerne mal in Ruhe das Beispiel hier zur Gemüte führen wie UDP in Java funktioniert:

Einer liest direkt, einer sendet direkt. Kein Handshake / Accept oder ähnliches. An die IP & Port binden und fertig. Und genau das macht der Thread-Ersteller hier - als Client, der was empfangen will.

Edit: Quark hier ist er ja der Server, weil er lauscht und nicht sendet - er bindet sich ja auf seine lokale Rechner IP. Ändert aber nix, die Unterscheidung zwischen Server & Client ist bei UDP - anders als bei TCP nicht durch den Aufbau einer Verbindung gegeben, sondern im Endeffekt durch die IP Adresse.
 
Er will keinen Server sondern einen Client
Wie Du es nennst, ist erst einmal egal. Er will empfangen. Und dazu macht er genau die richtigen Schritte. Rein lokal funktioniert es:
Testweise habe ich mir einen Server dazu geschrieben. Wenn ich die Daten über den Localhost dann sende, funktioniert es ohne Probleme.
Damit sollte doch auch Dir klar sein, dass er das, was er da macht, richtig gemacht hat...

Und die Dokumentation besagt überall das Gleiche. Selbst der Link von Dir besagt genau das, was wir Dir sagen. Und Deine Aussage von wegen Erst Senden damit man empfangen kann und Verbindungsaufbau sind und bleiben grober Unfug bei UDP / Datagram Sockets.
 
UDP ist eine Verbindungslose Datenübertragung. Da gibt es also keinen Verbindungsaufbau. Und den request hat er ja gesendet und das sogar noch überprüft mit Wireshark.

Daher halte ich die Windows Firewall auch für sehr wahrscheinlich. Daher ggf. einfach mal einen Befehl absetzen wie:
netsh firewall add portopening UDP 2020 "UDP Port 2020"
1) Verbindungslose Datenübertragung => Full Ack
2) Firewall => Danke das wars! Und ich dachte es recht wenn ich Eclipse in der Firewall freigebe. 🙄 Hat mir mehr als einen Arbeitstag gekostet. 😡

Danke für eure rege Teilnahme an der Diskusion.
 

Neue Themen


Zurück
Oben