2017-05-18 71 views
7

Korzystam z Android Studio do projektowania aplikacji i chcę ustawić wartość DSCP w nagłówku ip przy użyciu gniazd UDP. Śledzę to example.Nie można ustawić wartości DSCP w aplikacji na Androida

import android.os.Message; 
 

 
import java.io.IOException; 
 
import java.net.DatagramPacket; 
 
import java.net.DatagramSocket; 
 
import java.net.InetAddress; 
 
import java.net.SocketException; 
 
import java.net.UnknownHostException; 
 

 
public class UdpClientThread extends Thread{ 
 

 
    String dstAddress; 
 
    int dstPort; 
 
    private boolean running; 
 
    MainActivity.UdpClientHandler handler; 
 
    DatagramSocket socket; 
 
    InetAddress address; 
 

 
    public UdpClientThread(String addr, int port, MainActivity.UdpClientHandler handler) { 
 
     super(); 
 
     dstAddress = addr; 
 
     dstPort = port; 
 
     this.handler = handler; 
 

 
    } 
 

 
    public void setRunning(boolean running){ 
 
     this.running = running; 
 
    } 
 

 
    private void sendState(String state){ 
 
     handler.sendMessage(
 
       Message.obtain(handler, 
 
         MainActivity.UdpClientHandler.UPDATE_STATE, state)); 
 
    } 
 

 
    @Override 
 
    public void run() { 
 
     sendState("connecting..."); 
 

 
     running = true; 
 
     System.setProperty("java.net.preferIPv4Stack", "true"); 
 

 

 
     try { 
 
      socket = new DatagramSocket(); 
 
      socket.setTrafficClass(128); //Setting the DSCP value 
 
      address = InetAddress.getByName(dstAddress); 
 

 
      // send request 
 
      byte[] buf = new byte[256]; 
 

 
      DatagramPacket packet = 
 
        new DatagramPacket(buf, buf.length, address, dstPort); 
 

 

 
      socket.send(packet); 
 

 
      sendState("connected"); 
 

 
      // get response 
 
      packet = new DatagramPacket(buf, buf.length); 
 

 

 
      socket.receive(packet); 
 
      String line = new String(packet.getData(), 0, packet.getLength()); 
 

 
      handler.sendMessage(
 
        Message.obtain(handler, MainActivity.UdpClientHandler.UPDATE_MSG, line)); 
 

 
     } catch (SocketException e) { 
 
      e.printStackTrace(); 
 
     } catch (UnknownHostException e) { 
 
      e.printStackTrace(); 
 
     } catch (IOException e) { 
 
      e.printStackTrace(); 
 
     } finally { 
 
      if(socket != null){ 
 
       socket.close(); 
 
       handler.sendEmptyMessage(MainActivity.UdpClientHandler.UPDATE_END); 
 
      } 
 
     } 
 

 
    } 
 
}

Szukałem na tym forum i poznałem, że za pomocą System.setProperty("java.net.preferIPv4Stack", "true") możemy manipulować wartości DSCP. Ale to nie działa na Androidzie. Jak mogę osiągnąć pożądane zachowanie? Czy coś tu brakuje? Kod działa bez żadnych błędów, ale gdy sprawdzam w wireshark (przechwytując "dowolny" interfejs, a następnie stosując filtr dla udp) wartość DSCP pakietu, pozostaje niezmieniona. Używam Emulatora na Ubuntu 16, aby przetestować scenariusz. Każda pomoc jest doceniana.

+1

Czy kiedykolwiek próbowałeś tego na urządzeniu fizycznym? –

+0

@Sebastian Hojas, ['DatagramSocket.receive()' jest blokującym połączeniem] (https://stackoverflow.com/questions/40055175/how-to-interrupt-a-blocking-call-to-udp-sockets- receive/40055466 # 40055466), więc pakiet nie może być obsługiwany. Czy na pewno wykonywane są linie kodu pod wywołaniem? – Onik

Odpowiedz

1

Powyższy kod działa na urządzeniu z Androidem (testowane na Samsung Galaxy S4), ale nie na emulatorze. Jednak nie byłem w stanie ustawić tego System.setProperty("java.net.preferIPv4Stack", "true"); w czasie wykonywania przez kod. DSCP można ustawić bez jawnego ustawiania tej właściwości w systemie Android. Oprócz tego, jeśli chcesz zmienić wartość DSCP w nagłówku IP za pomocą prostego programu java innego niż android, możesz spojrzeć na to answer.

+0

Przepraszam. Czy istnieje sposób ustawić wartość DSCP na 'HttpUrlConnection', ale nie' Socket'? – Yeung

+0

@ Yeung, można sprawdzić metodę getPermission() w HttpUrlConnection. Mój pomysł jest taki, że dostajesz gniazdo, a następnie ustawiasz klasę DSCP na tym gnieździe połączenia URL http. –