Newsgroup: it.comp.java
Titolo: HELP!! Questito per gli esperti

Salve, sto provando da alcuni giorni a far funzionare un programma che ho
scritto in java, il quale semplicemente riceve dei dati su pacchetti
datagram da un indirizzo multicast e li redirige su altri pacchetti datagram
verso un altro indirizzo multicast.
Benché il problema sia semplice, purtroppo il risultato é penoso in termini
di prestazioni (come ho già scritto nel messaggio "Java??:...Prestazioni
indecenti!!!!" del 17-3-2000).
Ho pensato di proporvi il sorgente (scritto per jdk 1.1.8) di una versione
semplificata (a differenza di questa, la versione completa prevede due
thread, uno in lettura, l'altro in scrittura sui due indirizzi multicast,
collegati con due pipedstream, inoltre tutte le operazioni di IO sono
bufferizzate... ma per quanto riguarda le prestazioni non c'é una grossa
differenza), se avete 5 minuti per darci un'occhiata e spiegarmi dov'é che
ho commesso l'errore (presunto), ve ne sarei eternamente grato!!!
Se qulacuno é interessato alla versione completa gliela posso spedire senza
problemi.
Premetto che ho provato anche a compilare ed eseguire il tutto con la java
VM della IBM (il cui interprete usa un compilatore JIT), ma non é cambiato
granché, questo mi fa prensare che ci sia un errore nel programma.. ma non
riesco a capire dove!
GRAZIE a chiunque voglia aiutarmi!!!
_________________________________________________________________________
 /* Questa classe riceve pacchetti datagram da un flusso multicast e li
redirige su un altro flusso
/  Usage: java MulticastRedirector InputIpAddress InputPort OutputIpAddress
OutputPort timeout
*/
import java.io.*;
import java.net.*;
public class MulticastRedirector {
 final static int MAX_PACKET_LENGTH = 65509; // massima lunghezza di un
datagram ip
 public static void main(String [] args) {
  InetAddress inputAddress; // indirizzo multicast del flusso in ingresso
  InetAddress outputAddress;// indirizzo multicast del flusso in uscita
  int inputPort, outputPort, timeout;
  byte[] inBlock = new byte[MAX_PACKET_LENGTH];   // buffer x i dati in
ingresso
  byte[] outBlock = new byte[MAX_PACKET_LENGTH]; // buffer x i dati in
uscita
  try
   // Ricava i valori dei due InetAddress e delle due porte
   try{
    inputAddress  = InetAddress.getByName(args[0]);
    outputAddress  = InetAddress.getByName(args[2]);
   }
   catch (UnknownHostException e) {
    inputAddress  = InetAddress.getByName(args[0]);
    outputAddress  = InetAddress.getByName(args[2]);
   }
   inputPort = Integer.parseInt(args[1]);
   outputPort = Integer.parseInt(args[3]);
   timeout = Integer.parseInt(args[4]);
   /* In base ai valori immessi crea due MulticastSocket collegati
   /  alle porte indicate e poi li aggancia ai due indirizzi ip multicast
   */
   MulticastSocket multicastInputSocket = new MulticastSocket(inputPort);
   MulticastSocket multicastOutputSocket = new MulticastSocket(outputPort);
   multicastInputSocket.joinGroup(inputAddress);
   multicastOutputSocket.joinGroup(outputAddress);
   /* fissa il timeout per il socket in ingresso (in millisecondi),
   /  dopo questo tempo verrà sollevata un'eccezione InterruptedIOException
   */
   multicastInputSocket.setSoTimeout(timeout*1000);
   System.out.println("Socket creati, inizio la redirezione...");
   /* crea due DatagramPacket che verranno usati per ricevere
   /  e per ri-tramettere. Ogni datagram ha un suo buffer
   / (si può provare ad usare lo stesso buffer, ma non cambia molto)
   */
   DatagramPacket inputDP = new DatagramPacket(inBlock,MAX_PACKET_LENGTH);
   DatagramPacket outputDP = new DatagramPacket(outBlock,MAX_PACKET_LENGTH,
outputAddress, outputPort);
   /* riceve i pacchetti datagram da un socket e li ri-trasmette sull'altro,
   /  finché il socket di ingresso non va in timeout.
   */
   int c=0;
   while (true) {
    multicastInputSocket.receive(inputDP);
    System.arraycopy(inBlock,0,outBlock,0,MAX_PACKET_LENGTH);
    multicastOutputSocket.send(outputDP);
    // questa riga può servire a controllare il funzionamento del programma
    // System.out.println("Pacchetto "+(c++)+" ricevuto e trasmesso...");
   }
  }
  catch (NumberFormatException nfe) {
   System.err.println(nfe);
   System.err.println("Usage: java MulticastRedirector InputIpAddress
InputPort OutputIpAddress OutputPort timeout
");
   System.exit(1);
  }
  catch (InterruptedIOException ioe) {
   System.exit(1);
   System.err.println("Timeout!");
  }
  catch (Exception e) {
   System.err.println("Eccezione:"+e.toString());
   System.exit(1);
  }
 }
}

:
Con le performance, la miglior regola e' "profile, don't speculate" :)
Ti consiglio di dare un'occhiata a 
http://developer.java.sun.com/developer/technicalArticles/GUI/perfanal/inde
x.html
e giu' di li.
Per inciso, stai facendo un arraycopy di *sessantaquattro k* ad ogni 
datagram ricevuto. Ehm. Un filo peculiare, come tecnica, a meno che tu non 
stia usando il JDK per Cray 500. ;-) Ho come la sensazione che il tuo 
problema sia li'. 
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun

 wrote in message
8EFCD64F5c...@193.216.69.37...


niente!!!
Eh, allora resta solo il profiling. Ed eventualmente gli insulti a Java, dopo 
aver accuratamente eliminato le altre possibilita' ;-)
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun/