Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.01.2016, 10:31

[Java] Prüfen, ob remote UDT Port erreichbar ist

Gibt es eine Möglichkeit zu prüfen, ob der remote UDT Port beim Server mit Timeout erreichbar ist?
Ein Server sollte hinter keiner Firewall stehen und mit TCP funktioniert es auch.

Für TCP funktioniert es wie folgt:

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* check, if the remote port is open
*
* @param hostname hostname or ip address
* @param port number of port to check
* @param timeout timeout in seconds
*/
public static boolean checkIfRemotePortAvailable (String hostname, int port, int timeout) throws SocketException {
    Socket s = new Socket();
    s.setReuseAddress(true);
    SocketAddress sa = new InetSocketAddress(hostname, port);

    try {
        s.connect(sa, timeout * 1000);
    } catch (IOException e) {
        return false;
    } finally {
        if (s.isConnected()) {
            try {
                s.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return true;
        } else {
            return false;
        }
    }
}


Da UDT auf UDP basiert, aber reliable ist, hatte ich mal folgendes für UDP versucht:

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* check, if the remote udp port is open
*
* @param hostname hostname or ip address
* @param port number of port to check
* @param timeout timeout in seconds
*
* @return true, if port is open
*/
public static boolean checkIfUDPPortIsOpen (String hostname, int port, int timeout) {
    try{
        //create inet address
        InetAddress address = InetAddress.getByName(hostname);

        byte [] bytes = new byte[128];
        DatagramSocket ds = new DatagramSocket();
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        ds.setSoTimeout(timeout);
        ds.connect(address, port);
        ds.send(dp);
        ds.isConnected();
        dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);
        ds.close();

        return true;
    } catch(InterruptedIOException e){
        //System.out.println("closed");
        return false;
    } catch(IOException e){
        //System.out.println("closed");
        return false;
    }
}


Dies funktioniert aber nicht so richtig.
Hat jemand einen Tipp, wie man einen UDT Port prüfen könnte?
Indie Game-Dev Programmierer beim 2D MMORPG Pentaquin | Pentaquin Foren Vorstellung

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

04.01.2016, 11:31

UDP kennt so etwas wie Verbindungen nicht. Du kannst etwas an einen UDP Port schicken und wenn du dann eine Antwort erhälts, weißt du das der Port wohl offen war. Wenn keine Antwort kam ist entweder Port zu oder das Paket ging verloren. Dann kannst du den Vorgang noch ein paar mal wiederholen, wie es TCP intern für dich tun würde, und dann irgendwann sagen, dass der Port wahrscheinlich wirklich zu ist. Du musst dich aber beim Empfang des Antwortpakets darauf einstellen, dass kein Paket kommt. D.h. mit einem Timeout arbeiten.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

04.01.2016, 14:19

Ggf. können wir besser weiterhelfen, wenn wir wüssten um was für eine Serveranwendung es sich handelt. Ist diese von dir? Kannst du die Anwendung modifizieren? Unterstützt der Server ggf schon sowas wie ein Echo?
Allgemein lässt sich sagen, dass solange sich eine Anwendung/Computer nicht von sich aus "outet" man keine Möglichkeit hat, diese dazu zu "zwingen".
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

4

04.01.2016, 18:55

Danke für eure Antworten!

Den Server habe ich selbst mit Netty implementiert.
Bei einer neuen Verbindung sendet dieser auch automatisch eine Nachricht zum Client, damit dieser erkennen kann, dass der Port offen ist.
Leider erkennt Netty diese Verbindung nicht, öffnet damit auch keinen Netty Channel und sendet die Nachricht nicht.
Mit dem normalen Netty Client funktioniert das aber.
Indie Game-Dev Programmierer beim 2D MMORPG Pentaquin | Pentaquin Foren Vorstellung

Werbeanzeige