package com.num.helpers; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.num.Values; import com.num.models.Ipdv; import com.num.models.IpdvUnit; import com.num.models.Loss; import android.util.Log; public class LossHelper { public static double losspercentage; public int total; static Loss l; public static Ipdv ipdv; private static DatagramPacket getRequestPacket() { String request = "00002"; byte[] start_request_array = request.getBytes(); DatagramPacket request_packet = new DatagramPacket(start_request_array, start_request_array.length); return request_packet; } public static Loss getLoss() { l = new Loss(); DatagramSocket clientSocket = null; byte[] receive_data = new byte[1024]; DatagramPacket receive_packet = new DatagramPacket(receive_data, receive_data.length); //List<Long> ddTList = new ArrayList<Long>(); ipdv = new Ipdv(); int count = 0; int recvd = 0; try { clientSocket = new DatagramSocket(); clientSocket.connect(InetAddress.getByName(Values.LOSS_SERVER_ADDRESS), Values.LOSS_PORT); clientSocket.setSoTimeout(60000); clientSocket.send(getRequestPacket()); //receive_data = new byte[PACKET_SIZE]; //DatagramPacket receive_packet = new DatagramPacket(receive_data, receive_data.length); clientSocket.receive(receive_packet); String received = new String(receive_packet.getData(),0,receive_packet.getLength()); Log.d("Loss Test Worker", "received port"+received); clientSocket.close(); clientSocket = null; clientSocket = new DatagramSocket(); clientSocket.connect(InetAddress.getByName(Values.LOSS_SERVER_ADDRESS), Integer.parseInt(received)); clientSocket.setSoTimeout(120000); clientSocket.send(getRequestPacket()); int seq_count = 0; long dT1 = 0; long dT2 = 0; long n = 0; int[] diffarray = {9,7,5,3,1}; int[] seedarray = {1,2,3,4,5}; int diff = 0; int seed = 0; while(!received.equals("terminate")) { clientSocket.receive(receive_packet); long timestamp = new Date().getTime();//System.currentTimeMillis(); recvd++; received = null; String seq_number = (new String(receive_packet.getData(),0,4)); received = new String(receive_packet.getData(),4,receive_packet.getLength()-4); long rec_timestamp; int sequence_number; try { sequence_number = Integer.parseInt(seq_number); rec_timestamp = Long.parseLong(received); if(timestamp - rec_timestamp>Values.LOSS_THRESHOLD) { count++; //continue; } if(sequence_number%10==seedarray[(seed%5)]) { dT1 = timestamp-rec_timestamp; n = sequence_number; } else if(sequence_number==(n+diffarray[(diff%5)])) { seq_count++; dT2 = timestamp-rec_timestamp; //Log.d("Loss Test Worker", "dT2"); ipdv.addToList(new IpdvUnit(seq_count,(dT2 - dT1))); n = 0; dT1 = dT2 = 0; //Log.d("Loss Test Worker", "Pair: "+seedarray[seed%5]+" "+(n+diffarray[diff%5])); seed++; diff++; } } catch (NumberFormatException e) { continue; } //Log.d("Loss Test Worker", "Seq number = "+sequence_number); //Log.d("Loss Test Worker", "Time Diff = "+ (timestamp-rec_timestamp)); } Log.d("Loss Test Worker", ""+count); received = null; losspercentage = ((double)count)/Values.LOSS_TOTAL*100; /*for(Long item: ddTList) { Log.d("Loss Test Worker", "ipdv: "+item); }*/ l.setLosspercentage(losspercentage); l.setLost(count); l.setTotal(Values.LOSS_TOTAL); l.setIpdv(ipdv); } catch (SocketException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch(SocketTimeoutException e) { e.printStackTrace(); Log.d("Loss Test Worker", "Socket timed out. Loss = 100%"); l.setLosspercentage((Values.LOSS_TOTAL-recvd+count)/Values.LOSS_TOTAL); l.setLost(Values.LOSS_TOTAL-recvd+count); l.setTotal(Values.LOSS_TOTAL); if(ipdv!=null) { if(ipdv.getIpdvlist().size()>0) l.setIpdv(ipdv); } } catch (IOException e) { e.printStackTrace(); } /*catch (InterruptedException e) { } // TODO Auto-generated catch block e.printStackTrace(); }*/ finally { if(clientSocket!=null) { clientSocket.close(); } clientSocket = null; receive_data = null; } return l; } }