无法在Android应用中设置DSCP值

Has*_*bas 7 java sockets android udp android-studio

我正在使用android Studio进行应用程序开发,我想使用UDP套接字在ip标头中设置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);
            }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我在这个论坛上搜索过,我发现使用System.setProperty("java.net.preferIPv4Stack", "true")我们可以操纵DSCP值.但这似乎不适用于Android应用程序.我怎样才能实现理想的行为?我错过了什么吗?代码工作没有任何错误,但当我检查wireshark(捕获'任何'接口,然后应用udp的过滤器)数据包的DSCP值,它没有改变.我在ubuntu 16上使用Emulator来测试场景.任何帮助表示赞赏.

Has*_*bas 1

上面的代码适用于 Android 设备(在三星 Galaxy S4 上测试),但不适用于模拟器。但是,我无法System.setProperty("java.net.preferIPv4Stack", "true");在运行时通过代码进行设置。无需在 android 中显式设置此属性即可设置 DSCP。除此之外,如果您想使用android以外的简单java程序更改IP标头中的DSCP值,您可以看看这个答案