Corso di Reti di Calcolatori UNICAL – Facoltà di Ingegneria – a.a. 2002/2003 Esercitazione sul networking in Java (3a parte) e comandi di rete [email protected] 1 Datagrammi Le applicazioni che comunicano tramite socket possiedono un canale di comunicazione dedicato. Per comunicare, un client ed un server stabiliscono una connessione, trasmettono dati, quindi chiudono la connessione. Tutti i dati inviati sul canale sono ricevuti nello stesso ordine in cui sono stati inviati. Le applicazioni che comunicano tramite datagrammi inviano e ricevono pacchetti di informazione completamente indipendenti tra loro. Queste applicazioni non dispongono e non necessitano di un canale di comunicazione punto-a-punto. La consegna dei datagrammi alla loro destinazione non è garantita, e neppure l’ordine del loro arrivo. Il package java.net fornisce tre classi che consentono di scrivere applicazioni che usano datagrammi per inviare e ricevere pacchetti sulla rete: DatagramSocket, DatagramPacket e MulticastSocket. Una applicazione può inviare e ricevere DatagramPacket tramite un DatagramSocket. Inoltre, i DatagramPacket possono essere inviati in broadcast a più destinatari che sono in ascolto su un MulticastSocket. NOTA: MulticastSocket estende DatagramSocket 2 java.net.DatagramSocket • DatagramSocket (int port) Crea un DatagramSocket e lo collega alla porta specificata sulla macchina locale. • void receive (DatagramPacket p) Riceve un DatagramPacket da questo socket. • void send (DatagramPacket p) Invia un DatagramPacket su questo socket. • void close () Chiude questo DatagramSocket. 3 java.net.DatagramPacket • DatagramPacket (byte[] buf, int length) Crea un DatagramPacket per ricevere pacchetti di lunghezza length. • DatagramPacket (byte[] buf, int length, InetAddress address, int port) Crea un DatagramPacket per inviare pacchetti di lunghezza length all’host ed alla porta specificati. • InetAddress getAddress () Restituisce l’indirizzo IP della macchina alla quale questo DatagramPacket deve essere inviato o da cui è stato ricevuto. • int getPort () Restituisce la porta della macchina alla quale questo DatagramPacket deve essere inviato o da cui è stato ricevuto. 4 TimeServer (1) import java.io.*; import java.net.*; import java.util.*; public class TimeServer { public static void main(String[] args) { DatagramSocket socket = null; try { socket = new DatagramSocket(3575); int n = 1; while (n <= 10) { byte[] buf = new byte[256]; // riceve la richiesta DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); // produce la risposta String dString = new Date().toString(); buf = dString.getBytes(); 5 TimeServer (2) // invia la risposta al client InetAddress address = packet.getAddress(); int port = packet.getPort(); packet = new DatagramPacket(buf, buf.length, address, port); socket.send(packet); n++; } socket.close(); } catch (IOException e) { e.printStackTrace(); socket.close(); } } } 6 TimeClient (1) import java.io.*; import java.net.*; import java.util.*; public class TimeClient { public static void main(String[] args) throws IOException { String hostname = "localhost"; DatagramSocket socket = new DatagramSocket(); // invia la richiesta byte[] buf = new byte[256]; InetAddress address = InetAddress.getByName(hostname); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 3575); socket.send(packet); 7 TimeClient (2) // riceve la risposta packet = new DatagramPacket(buf, buf.length); socket.receive(packet); // visualizza la risposta String received = new String(packet.getData()); System.out.println("Response: " + received); socket.close(); } } 8 java.net.MulticastSocket • MulticastSocket (int port) Crea un MulticastSocket e lo collega alla porta specificata sulla macchina locale. • void joinGroup (InetAddress mcastaddr) Si collega ad un multicast group. • void leaveGroup (InetAddress mcastaddr) Abbandona un multicast group. • void receive (DatagramPacket p) Riceve un DatagramPacket da questo socket. • void send (DatagramPacket p) Riceve un DatagramPacket da questo socket. • void close () Chiude questo MulticastSocket. 9 MulticastTimeServer (1) import java.io.*; import java.net.*; import java.util.*; public class MulticastTimeServer { public static void main(String[] args) { MulticastSocket socket = null; try { socket = new MulticastSocket(3575); int n = 1; while (n <= 100) { byte[] buf = new byte[256]; // non aspetta la richiesta String dString = new Date().toString(); buf = dString.getBytes(); 10 MulticastTimeServer (2) // invia il messaggio in broadcast InetAddress group = InetAddress.getByName("230.0.0.1"); DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 3575); socket.send(packet); System.out.println ("Broadcasting: "+dString); Thread.sleep(1000); n++; } socket.close(); } catch (Exception e) { e.printStackTrace(); socket.close(); } } } 11 MulticastTimeClient import java.io.*; import java.net.*; import java.util.*; public class MulticastTimeClient { public static void main(String[] args) throws IOException { MulticastSocket socket = new MulticastSocket(3575); InetAddress group = InetAddress.getByName("230.0.0.1"); socket.joinGroup(group); DatagramPacket packet; for (int i = 0; i < 100; i++) { byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); socket.receive(packet); String received = new String(packet.getData()); System.out.println("Time: " + received); } socket.leaveGroup(group); socket.close(); } } 12 ping (1) Invia una successione di pacchetti all'host specificato, per verificare l'integrità e la qualità della connessione. Sintassi Windows: ping [-t] [-n conteggio] [-w timeout] hostname Opzioni: -t Effettua un ping sull'host specificato finché non viene interrotto. Per interrompere digitare Ctrl-C. -n conteggio Numero di richieste di eco da inviare. -w timeout Timeout in millisecondi per ogni risposta. 13 ping (2) C:\>ping java.sun.com Esecuzione di Ping java.sun.com [192.18.97.71] con 32 byte di dati: Risposta da 192.18.97.71: byte=32 durata=210ms TTL=241 Risposta da 192.18.97.71: byte=32 durata=201ms TTL=241 Risposta da 192.18.97.71: byte=32 durata=200ms TTL=241 Risposta da 192.18.97.71: byte=32 durata=201ms TTL=241 Statistiche Ping per 192.18.97.71: Pacchetti: Trasmessi = 4, Ricevuti = 4, Persi = 0 (0% persi), Tempo approssimativo percorsi andata/ritorno in millisecondi: Minimo = 200ms, Massimo = 210ms, Medio = 203ms 14 host (1) Effettua la risoluzione (diretta ed inversa) dell’host specificato Sintassi Linux (non disponibile sotto Windows): host hostname [server] Opzioni: server è il nome del server DNS da utilizzare (se non specificato usa il DNS di default) 15 host (2) # host java.sun.com java.sun.com. has address 192.18.97.71 # host www.deis.unical.it www.deis.unical.it. is an alias for haldo.deis.unical.it. haldo.deis.unical.it. has address 160.97.27.7 # host 192.18.97.71 71.97.18.192.in-addr.arpa. domain name pointer flres.java.Sun.COM. 16 nslookup Effettua la risoluzione (diretta ed inversa) dell’host specificato. C:\>nslookup java.sun.com Server: dns.isi.cs.cnr.it Address: 194.119.198.151 Nome: java.sun.com Address: 192.18.97.71 C:\>nslookup 192.18.97.71 Server: dns.isi.cs.cnr.it Address: 194.119.198.151 Nome: flres.java.Sun.COM Address: 192.18.97.71 17 traceroute (1) Mostra tutti i router che un pacchetto attraversa per raggiungere l’host di destinazione Sintassi Windows: tracert [-d] [-h max_salti] [-w timeout] hostname Opzioni: -d Non risolve gli indirizzi in nome host. -h max_salti Numero massimo di punti di passaggio per ricercare la destinazione. -w timeout Timeout in millisecondi per ogni risposta. 18 traceroute (2) C:\>tracert java.sun.com Rilevazione instradamento verso java.sun.com [192.18.97.71] su un massimo di 30 punti di passaggio: 1 <10 ms <10 ms <10 ms 194.119.198.129 2 <10 ms 30 ms 10 ms 10.0.0.134 3 40 ms 30 ms 40 ms rc-cnrcs.na.garr.net [193.206.130.125] 4 20 ms 60 ms 60 ms rt-rc-1.na.garr.net [193.206.134.169] 5 30 ms 30 ms 40 ms mi-na.garr.net [193.206.134.9] 6 40 ms 41 ms 30 ms rtg-rt.mi.garr.net [193.206.134.206] 7 30 ms 40 ms 40 ms rm-mi-g.garr.net [193.206.134.14] 8 40 ms 50 ms 40 ms mno-vcn-i1-pos0-2.telia.net [213.248.79.125] … 12 190 ms 190 ms 211 ms nyk-bb1-pos1-0-0.telia.net [213.248.80.13] 13 200 ms 190 ms 201 ms sl-gw9-nyc-7-2.sprintlink.net [144.232.169.61] … 18 230 ms 231 ms 220 ms sl-gw14-che-8-0.sprintlink.net [144.232.15.162] 19 220 ms 211 ms 210 ms sl-internap-26-0-0.sprintlink.net [160.81.54.46] 20 230 ms 220 ms 211 ms border3.ge3-0-bbnet2.den.pnap.net [216.52.40.71] 21 201 ms 210 ms 220 ms sun-1.border3.den.pnap.net [216.52.42.42] 22 210 ms 211 ms 220 ms flres.java.Sun.COM [192.18.97.71] Rilevazione completata. 19 netstat Visualizza statistiche su protocollo e connessioni di rete TCP/IP Sintassi: netstat [-a] Opzioni: -a Visualizza tutte le connessioni e le porte di ascolto C:\>netstat Connessioni attive Proto Indirizzo locale TCP host1:22 TCP host1:1408 Indirizzo remoto host2 host3 Stato ESTABLISHED TIME_WAIT 20