# UDP Packet empfangen funktioniert nicht.



## godi (13. Jul 2021)

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:

```
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


----------



## LimDul (13. Jul 2021)

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.


----------



## Jw456 (13. Jul 2021)

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.


----------



## LimDul (13. Jul 2021)

Jw456 hat gesagt.:


> 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.


----------



## kneitzel (13. Jul 2021)

Jw456 hat gesagt.:


> 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"`


----------



## Jw456 (13. Jul 2021)

> Und den request hat er ja gesendet


Wo in seinen Code hat er das gemacht.

Etwas wie 
socket.send(request); sehe ich nicht im Code.


----------



## LimDul (13. Jul 2021)

Jw456 hat gesagt.:


> Wo in seinen Code hat er das gemacht.
> 
> Etwas wie
> socket.send(request); sehe ich nicht im Code.


Lies mal den Startpost - das ist ein externes Gerät. Und vermutlich kein Java Programm


----------



## Jw456 (13. Jul 2021)

Zum Thema grober unfug 





						Socket (Software) – Wikipedia
					






					de.m.wikipedia.org


----------



## LimDul (13. Jul 2021)

Jw456 hat gesagt.:


> Zum Thema grober unfug
> 
> 
> 
> ...


Klär mich auf, was du mir mit dem Random Link über OS Sockets sagen willst?


----------



## kneitzel (13. Jul 2021)

Jw456 hat gesagt.:


> Zum Thema grober unfug
> 
> 
> 
> ...


Und hast Du da mal unter Datagram-Socket gelesen, was da Sache ist?

Serverseitig:

Socket erstellen
Socket binden
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.


----------



## LimDul (13. Jul 2021)

Du kannst dir gerne mal in Ruhe das Beispiel hier zur Gemüte führen wie UDP in Java funktioniert:








						A Guide To UDP In Java | Baeldung
					

A quick and practical guide to UDP in Java




					www.baeldung.com
				




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.


----------



## kneitzel (13. Jul 2021)

Sowas gibt es übrigens auch von Oracle: https://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html

Die Oracle Dokumentation beruht zwar fast komplett auf Java 8, aber diese Grundlagen sind ja mehr oder weniger seid Java 1.0 so drin denke ich mal.


----------



## Jw456 (13. Jul 2021)

Er will keinen Server sondern einen Client


----------



## LimDul (13. Jul 2021)

Jw456 hat gesagt.:


> Er will keinen Server sondern einen Client


Nein. Aus deinem Link:



> _Client-seitig_:
> 
> 
> Socket erstellen
> ...


Er will empfangen - nicht senden. Also Server.


----------



## kneitzel (13. Jul 2021)

Jw456 hat gesagt.:


> 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:


godi hat gesagt.:


> 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.


----------



## Jw456 (13. Jul 2021)

> Rein lokal funktioniert es


Wenn das so ist sind wir ein Stück weiter. Das local habe es ich wohl überlesen.


----------



## godi (14. Jul 2021)

kneitzel hat gesagt.:


> 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.


----------

