SILENTSOFT
Published on

Java에서 NetworkInterface를 이용하여 IP Address 가져오는 방법

Authors

윈도우 머신 기준으로 cmd> ipconfig -all을 수행하면 하나의 연결에 IPv4 Address가 여러 개 물려있는 경우가 간혹가다 있다.

Inet4Address.getLocalHost().getHostAddress()

위 코드는 IPv4 Address가 하나일 때 잘 동작하지만, 위에서 언급 한대로 IPv4 Address가 여러 개인 경우 비활성화된 IPv4 Address를 리턴하기도 한다.

이럴 때에는 NetworkInterface를 이용하여 아래와 같이 가져오면 된다.

public static String getHostAddress() {
    InetAddress localAddress = getLocalAddress();
    if (localAddress == null) {
        try {
            return Inet4Address.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            ;
        }
    } else {
        return localAddress.getHostAddress();
    }


    return "";
}

private static InetAddress getLocalAddress() {
    try {
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while (networkInterfaces.hasMoreElements()) {
            List<InterfaceAddress> interfaceAddresses = networkInterfaces.nextElement().getInterfaceAddresses();
            for (InterfaceAddress interfaceAddress : interfaceAddresses) {
                InetAddress address =interfaceAddress.getAddress();
                if (address.isSiteLocalAddress()) {
                    return address;
                }
            }
        }
    } catch (Exception e) {
        ;
    }


    return null;
}

위 소스 코드 2번째 라인 localAddress가 null인 경우는 없거나 매우 드물겠지만 그래도 혹시나 해서 방어 로직으로 Inet4Address를 통해 가져오도록 했다.