2017-05-18 16 views
7

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.

+1

Bạn đã bao giờ thử trên thiết bị thực? –

+0

@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

Trả lời

1

Mã trên hoạt động trên thiết bị Android (được thử nghiệm trên Samsung Galaxy S4) nhưng không có trên trình mô phỏng. Tuy nhiên, tôi không thể đặt số này System.setProperty("java.net.preferIPv4Stack", "true"); vào thời gian chạy qua mã. DSCP có thể được thiết lập mà không đặt rõ ràng thuộc tính này trong android. Ngoài ra, nếu bạn muốn thay đổi giá trị DSCP trong tiêu đề IP bằng cách sử dụng chương trình java đơn giản khác với android, bạn có thể xem tại đây answer.

+0

Xin lỗi. Có cách nào để thiết lập giá trị DSCP trên 'HttpUrlConnection' nhưng không phải là' Socket'? – Yeung

+0

@Yeung, bạn có thể kiểm tra phương thức getPermission() của HttpUrlConnection. Ý tưởng của tôi là bạn nhận được socket và sau đó thiết lập DSCP Class trên socket đó của kết nối http url. –

Các vấn đề liên quan