Tôi đang sử dụng Android Studio để phát triển ứng dụng và tôi muốn đặt giá trị DSCP trong tiêu đề ip bằng cách sử dụng ổ cắm UDP. Tôi đang theo dõi điều này example.Không thể đặt giá trị DSCP trong ứng dụng android
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);
}
}
}
}
tôi đã tìm kiếm trên diễn đàn này và tôi đến để biết rằng việc sử dụng System.setProperty("java.net.preferIPv4Stack", "true")
chúng ta có thể thao tác các giá trị DSCP. Nhưng điều này có vẻ không hoạt động trên ứng dụng android. Làm thế nào tôi có thể đạt được hành vi mong muốn? Tôi có bỏ sót gì ở đây không? Các mã hoạt động mà không có bất kỳ lỗi nào nhưng khi tôi kiểm tra trong wireshark (chụp 'bất kỳ' giao diện và sau đó áp dụng các bộ lọc cho udp) giá trị của DSCP của gói tin, nó không thay đổi. Tôi đang sử dụng Emulator trên ubuntu 16 để kiểm tra kịch bản. Bất kỳ trợ giúp được đánh giá cao.
Bạn đã bao giờ thử trên thiết bị thực? –
@Sebastian Hojas, ['DatagramSocket.receive()' là một cuộc gọi chặn] (https://stackoverflow.com/questions/40055175/how-to-interrupt-a-blocking-call-to-udp-sockets-receive/40055466 # 40055466), vì vậy gói có thể không được xử lý. Bạn có chắc chắn các dòng mã bên dưới cuộc gọi đang được thực thi không? – Onik