2017-05-18 9 views
7

アプリ開発にアンドロイドスタジオを使用していて、UDPソケットを使用してIPヘッダーにDSCP値を設定します。私はこれに従いますexampleアンドロイドアプリでDSCP値を設定できません

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); 
 
      } 
 
     } 
 

 
    } 
 
}

私はこのフォーラムで検索しましたし、私はSystem.setProperty("java.net.preferIPv4Stack", "true")使用して、我々はDSCP値を操作できることを知っているようになりました。しかし、これはアンドロイドアプリで動作していないようです。どのようにして希望の動作を達成できますか?私はここで何かを逃していますか?コードはエラーなしで動作しますが、パケットのDSCPの値をwireshark(「any」インターフェイスをキャプチャしてからudpのフィルタを適用する)にチェックインすると、変更されません。私は、ubuntu 16でEmulatorを使ってシナリオをテストしています。どんな助けもありがとうございます。

+1

物理デバイスで試したことがありますか? –

+0

@Sebastian Hojas、['DatagramSocket.receive()'はブロック呼び出しです](https://stackoverflow.com/questions/40055175/how-to-interrupt-a-blocking-call-to-udp-sockets-receive/40055466#40055466)、パケットが処理されないことがあります。コールの下にあるコード行が実行されていますか? – Onik

答えて

1

上記のコードはAndroidデバイス(samsung galaxy S4でテスト済み)では動作しますが、エミュレータでは動作しません。しかし、実行時にコードでSystem.setProperty("java.net.preferIPv4Stack", "true");を設定することができませんでした。明示的にこのプロパティをアンドロイドに設定せずにDSCPを設定することができます。これに加えて、アンドロイド以外の単純なJavaプログラムを使用してIPヘッダーのDSCP値を変更する場合は、answerをご覧ください。

+0

すみません。 'HttpUrlConnection'ではDSCP値を設定する方法はありますが、' Socket'では設定できませんか? – Yeung

+0

@ Yeungでは、HttpUrlConnectionのgetPermission()メソッドをチェックすることができます。私の考えは、あなたがソケットを取得し、http url接続のそのソケットにDSCPクラスを設定することです。 –

関連する問題