안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요. 안드로이드 UDP 소켓통신 프로그래밍 공부를 하고 있습니다.
안드로이드에서 TCP 소켓을 관리하는 Socket 클래스를 통해 간단한 서버/클라이어트 프로그램을 만들었습니다.
(당연 메니페스트 파일에 INTERNET User-permission을 추가하였습니다.)
이 Socket 클래스 중 setTrafficClass(int value) 메쏘드가 존재합니다. API 설명으로는 소켓을 통해 전송하는 IP 헤더의 TOS 필드값을
설정할 수 있는 메쏘드라고 나와있습니다.
하지만, 테스트를 위해 간단히 아래와 같이 소켓 생성 후, 바로 적용을 하고 Wireshark를 통해 패킷을 캡춰하고
전송한 IP 헤더를 보면 TOS 필드값이 그냥 0x00 으로 의도한대로 적용이 되지 않습니다.
안드로이드에서 TCP 소켓을 관리하는 Socket 클래스를 통해 간단한 서버/클라이어트 프로그램을 만들었습니다.
(당연 메니페스트 파일에 INTERNET User-permission을 추가하였습니다.)
이 Socket 클래스 중 setTrafficClass(int value) 메쏘드가 존재합니다. API 설명으로는 소켓을 통해 전송하는 IP 헤더의 TOS 필드값을
설정할 수 있는 메쏘드라고 나와있습니다.
하지만, 테스트를 위해 간단히 아래와 같이 소켓 생성 후, 바로 적용을 하고 Wireshark를 통해 패킷을 캡춰하고
전송한 IP 헤더를 보면 TOS 필드값이 그냥 0x00 으로 의도한대로 적용이 되지 않습니다.
private class TCPclient implements Runnable{
private static final String serverIP = "xxx.xxx.xxx.xxx";
private static final int serverPort = 7777;
private String msg;
public TCPclient(String _msg){
this.msg = _msg;
}
@Override
public void run(){
try{
InetAddress serverAddr = InetAddress.getByName(serverIP);
Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, serverPort);
socket.setTrafficClass(5);
try {
Log.d("TCP", "C: Sending: '" + msg + "'");
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
out.println(msg);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
return_msg = in.readLine();
Log.d("TCP", "C: Server send to me this message -->" + return_msg);
} catch(Exception e) {
Log.d("TCP", "C: Error1", e);
} finally {
socket.close();
}
} catch (Exception e) {
Log.e("TCP", "C: Error2", e);
}
}
}
}
제가 메쏘드를 잘못 사용한 것인지, 아니면 안드로이드 API에서 공개만 되고 기능 적용이 되지 않는 것인지 궁금합니다.
고수님의 답변을 기다리겠습니다. 감사합니다.




혹시 해결하셨나요?
저도 위와같은 문제로 많이 테스트를 해보았는데,
지금까지 제가 내린 결론은 안드로이드는 TOS 수정을 지원하지 않는것 같다 입니다.
똑같은 코드로 자바어플로 돌리면 TOS 필드가 수정된것을 볼 수 있지만 안드로이드 어플에서는 수정이 안되더군요.
이게 되야하는데 안되니 조금 답답하네요.
아무튼 좋은 결과 있기를 바라겠습니다.