アプリ開発にアンドロイドスタジオを使用していて、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を使ってシナリオをテストしています。どんな助けもありがとうございます。
物理デバイスで試したことがありますか? –
@Sebastian Hojas、['DatagramSocket.receive()'はブロック呼び出しです](https://stackoverflow.com/questions/40055175/how-to-interrupt-a-blocking-call-to-udp-sockets-receive/40055466#40055466)、パケットが処理されないことがあります。コールの下にあるコード行が実行されていますか? – Onik