마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 5.0 이상에서 잘 돌아가던 통신이 4.4버전 이하에서는 unknownHostException에 빠집니다.

0 추천

제목 그대로 안드로이드 5.0 이상에서 잘 돌아가던 게

4.4버전에서 테스트를 해보니까 UnknownException에 빠져버립니다.

4.4버전에서는 밑에 메소드를 이용하지 말고 다른 방법을 써야하나요??

UDPIp = InetAddress.getByName(mData.getIp());
public static InetAddress getByName(String host) throws UnknownHostException {
    return getAllByNameImpl(host)[0];
}
zenojm (2,840 포인트) 님이 2017년 9월 25일 질문

1개의 답변

0 추천
 
채택된 답변

UnknownHostException이 아니고, UnknownException이 난다는 건가요?
에러 메시지를 복사해서 올려 줘야 답을 찾을 가능성이 높습니다.

체크포인트1: 
InetAddress.getByName("www.test.com"); --> IP가 들어가는 게 아니라 도메인 이름을 가지고 IPAddress를 가지고 오는 부분입니다.

체크포이트2:
java.net.InetAddress[] x=  java.net.InetAddress.getAllByName(DOMAIN_NAME) ;
여기서 x가 null인지 size가 0인지 확인해서 오류 처리를 해야 합니다.
도메인이름이 잘못되면, x는 값이 없을 겁니다.

Will Kim (43,170 포인트) 님이 2017년 9월 25일 답변
zenojm님이 2017년 12월 18일 채택됨
답변 주셔서 감사합니다.

W/System.err: java.net.UnknownHostException: Unable to resolve host "192.168.002.249": No address associated with hostname
W/System.err:     at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
W/System.err:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
W/System.err:     at java.net.InetAddress.getByName(InetAddress.java:289)
W/System.err:     at com.homenetwork.MainActivity$Client.run(MainActivity.java:7859)
W/System.err:     at java.lang.Thread.run(Thread.java:841)
W/System.err: Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
W/System.err:     at libcore.io.Posix.getaddrinfo(Native Method)
W/System.err:     at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
W/System.err:     at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
W/System.err:     ... 4 more

에러메시지가 이렇게 뜨고 있구요
도메인 이름이 아니라 IP가 들어가고 있습니다...
상위버전에서는 괜찮더니 킷캣 이하 버전에서만 이렇게 뜨네요ㅜㅜ
제가 헷갈렸습니다.

기본적으로 nslookup이라는 기능입니다.
예를들면 www.google.com으로 nslookup을 하면 ip주소를 리턴해 주는 거죠.
저 기능을 쓰는 이유는 소켓이나 이런 라이브러리들은 도메인으로 접속을 못하기 때문에, 도메인을 IP 주소로 바꾸기 위한 용도입니다.

lookupHostByName은 이름으로 Host의 ip을 찾는 함수입니다.

따라서 IP주소를 이미 알고 있다면,
아래처럼 getByName만 쓰면 됩니다.
InetAddress inetAddress = InetAddress.getByName("192.168.0.105");

에러메시지에 보면.. www.google.com으로 검색할 때는 loopupHostByName을 쓰면 되지만, IP 주소인 경우에는 getByName만 바로쓰면 됩니다.
함수를 두개로 나누어서 용도에 따라 쓰시면 될 것 같습니다.
...