Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 인터넷 연결 여부 확인하는 방법 완벽 가이드

C#으로 개발할 때 네트워크 상태에 따라 로직을 분기해야 하는 경우가 자주 있습니다. 이 글에서는 System.Net 네임스페이스를 활용하여 특정 머신의 인터넷 연결 여부를 확인하는 방법을 소개합니다.

핵심 원리

System.Net 네임스페이스는 URI로 식별되는 리소스에 데이터를 주고받는 공통 메서드를 제공합니다. 대표적으로 WebClient 또는 HttpClient 클래스를 사용하면 로컬, 인트라넷, 인터넷상의 어떤 URI 리소스와도 통신할 수 있습니다.

여기서는 WebClient의 OpenRead 메서드를 사용합니다. 이 메서드는 지정된 리소스의 데이터를 Stream(스트림) 형태로 반환하며, 요청이 성공하면 인터넷이 연결된 것으로 판단하고 true, 실패하면 false를 반환합니다.

체크용 URL 선택

연결 테스트에는 https://google.com/generate_204 URL을 사용하는 것이 좋습니다. 이 엔드포인트는 본문 없이 HTTP 204(No Content) 상태 코드만 응답하기 때문에 데이터 전송량이 거의 없어 연결 확인 용도로 매우 효율적입니다.

예제 코드

아래 예제는 무한 루프를 돌면서 인터넷 연결 여부를 반복적으로 확인합니다. 연결되면 "Connected"를 출력하고 루프를 종료하며, 연결되지 않으면 계속 재시도합니다.

static void Main(string[] args){
    var keepRetrying = true;
    while (keepRetrying){
        if (IsConnectedToInternet()){
            keepRetrying = false;
            System.Console.WriteLine("Connected");
        } else {
            keepRetrying = true;
            System.Console.WriteLine("Not Connected");
        }
    }
}

public static bool IsConnectedToInternet(){
    try{
        using (var client = new WebClient())
        using (client.OpenRead("https://google.com/generate_204"))
            return true;
    }
    catch { }
    return false;
}

실행 결과

Connected

코드가 실행되면 인터넷이 연결되어 있는 경우 위와 같이 Connected가 출력되고, 그렇지 않은 경우에는 연결될 때까지 "Not Connected"가 반복해서 출력됩니다.

참고: 최신 .NET에서는 HttpClient 사용 권장

WebClient는 .NET 6부터 더 이상 권장되지 않으므로, 최신 프로젝트에서는 다음과 같이 HttpClient를 사용하는 것이 좋습니다.

private static readonly HttpClient httpClient = new HttpClient();

public static async Task<bool> IsConnectedToInternetAsync(){
    try{
        using var response = await httpClient.GetAsync(
            "https://google.com/generate_204",
            HttpCompletionOption.ResponseHeadersRead);
        return response.IsSuccessStatusCode;
    }
    catch { }
    return false;
}

HttpClient 인스턴스는 애플리케이션 전체에서 하나만 생성하여 재사용하는 것이 성능 면에서 유리합니다. 또한 실무에서는 DNS 오류, 타임아웃 등 다양한 예외 상황을 고려해 catch 블록에서 로그를 남기는 것이 좋습니다.