Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    tunneling UDP

    qualcuno mi da una mano?
    devo creare una sorta di tunneling su UDP...

    cio che mi servirebbe ora è, dati vari campi in vari formati:
    1. InetAddress dest_ip;
    2. int port;
    3. int channel;
    4. byte[] data;

    inserirli TUTTI nel campo Data di un DatagramPacket, che deve essere in formato byte[].

    Come faccio a riunire i 4 campi scritti sopra tutti nel Data di un pacchetto UDP facendo in modo che poi in ricezione io possa nuovamente discriminarli?

    mi aiutate?

    grazie


    PS. io avevo provato a creare un Vector, per poi convertirlo in byte.. ma non riesco..

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: tunneling UDP

    Originariamente inviato da menostress
    Come faccio a riunire i 4 campi scritti sopra tutti nel Data di un pacchetto UDP facendo in modo che poi in ricezione io possa nuovamente discriminarli?
    Ecco una possibilità:
    codice:
    ByteArrayOutputStream baos = new ByteArrayOutputStream ();
    DataOutputStream dos = new DataOutputStream (baos);
    
    byte[] addr = dest_ip.getAddress ();
    
    dos.write (addr, 0, addr.length);
    dos.writeInt (port);
    dos.writeInt (channel);
    dos.write (data, 0, data.length);
    
    byte[] packet = baos.toByteArray ();
    Occhio solo ad una cosa: lo stream di dati generato dal DataOutputStream contiene i dati senza alcun "tag", cioè senza alcuna marcatura di cosa/quanti siano i byte!
    Vuol dire che in packet avrai: 4 byte (se dest_ip è IPv4) + 1 intero (4 byte) + 1 intero (4 byte) + N byte.
    Questo devi saperlo tu!! E in lettura dovrai fare le read in modo da prendere gli stessi tipi di dati.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ok... in lettura ho impostato na cosa del genere:

    codice:
    int channel = payload[0];
    byte[] addr = new byte[4];
    		
    for(int j=1; j<5; j++)
    	addr[j-1]=payload[j];
    		
    InetAddress dest_IP = InetAddress.getByAddress(addr);
    int dest_port = payload[2];
    			
    byte[] sendData = new byte[payload.length-6];
    for(int j=5; j<payload.length; j++)
    	sendData[j-5]=payload[j];
    "dovrebbe andare bene"!
    ...ora continuo con altre sezioni del programma e poi faccio dei test...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da menostress
    codice:
    int channel = payload[0];
    byte[] addr = new byte[4];
    		
    for(int j=1; j<5; j++)
    	addr[j-1]=payload[j];
    		
    InetAddress dest_IP = InetAddress.getByAddress(addr);
    int dest_port = payload[2];
    			
    byte[] sendData = new byte[payload.length-6];
    for(int j=5; j<payload.length; j++)
    	sendData[j-5]=payload[j];
    Mi dispiace, ma non credo proprio che vada bene!!
    channel e dest_port li prendi da 1 solo byte???

    Meglio se usi DataInputStream/ByteArrayInputStream, cioè l'opposto del metodo che ho indicato io. Tieni presente che DataOutputStream scrive i dati in un formato ben preciso (e che devi conoscere se vuoi riprendere i dati senza usare DataInputStream). Ad esempio i valori interi li scrive in formato big-endian.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5


    non riesco...
    come se fa?


  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da menostress


    non riesco...
    come se fa?

    Per impacchettare i dati usa il codice che ho postato io all'inizio, per spacchettare i dati usa DataInputStream/ByteArrayInputStream, cioè l'opposto, e fai la stessa cosa ma con delle read/readInt.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    codice:
    ByteArrayInputStream bais = new ByteArrayInputStream(payload);
    DataInputStream dis = new DataInputStream(bais);
    		
    int channel    = dis.readInt();			
    int dest_port  = dis.readInt();			
    byte[] addr_in = { dis.readByte(),dis.readByte(),dis.readByte(),dis.readByte() };  		
    byte[] sendData = ???????????????????????????? //ATT!!! N byte!!!

    tralasciando l'eleganza della mia programmazione...
    come faccio a memorizzare in un array di byte quello che avevo inserito con
    codice:
    dos.write (data, 0, data.length);
    il problema è che all'arrivo del pacchetto NON so la length... :master:

    PS: gli altri campi li leggo in modo corretto.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da menostress
    codice:
    byte[] addr_in = { dis.readByte(),dis.readByte(),dis.readByte(),dis.readByte() };
    Meglio se fai:
    codice:
    byte[] addr_in = new byte[4];
    int n = dis.read (addr_in);
    e poi testi ovviamente che la read ritorni 4!

    Originariamente inviato da menostress
    come faccio a memorizzare in un array di byte quello che avevo inserito con
    codice:
    dos.write (data, 0, data.length);
    il problema è che all'arrivo del pacchetto NON so la length... :master:
    Beh, hai due possibilità:
    - o scrivi nello stream, prima dei dati, un valore di tipo 'int' che indica la lunghezza dei dati
    - o calcoli la lunghezza dei dati dalla lunghezza payload - 12
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    ...risolto il problema prima proposto, ora me ne si è presentato un altro:

    ho un thread che apre 4 socket UDP...
    devo effettuare una sorta di sistema a "polling" che testi se su qualche socket è arrivato qualche messaggio e, a seconda della porta su cui arrivano i msg, devo gestirli in modo opportuno!...
    io avrei pensato ad una sorta di sistema di "interrogazioni" ad intervalli regolari gestiti da un Timer, ma proprio non riesco ad implementarlo... :master:
    qualcuno mi può aiutare in questa mia idea oppure mi può indicare qualche altra strada?

    sono un neofita di Java... ma pian panino le idee mi vengono, solo che ancora non sono abilissimo ad implementarle!

    grazie in anticipo per l'aiuto!!!

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da menostress
    ho un thread che apre 4 socket UDP...
    devo effettuare una sorta di sistema a "polling" che testi se su qualche socket è arrivato qualche messaggio e, a seconda della porta su cui arrivano i msg, devo gestirli in modo opportuno!...
    io avrei pensato ad una sorta di sistema di "interrogazioni" ad intervalli regolari gestiti da un Timer, ma proprio non riesco ad implementarlo... :master:
    Il "polling" in genere non è una buona soluzione. Il modo migliore per gestire una cosa del genere è avere più thread, in cui ognuno opera con 1 solo socket.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.