본문 바로가기
.NET

C#에서도 inet_addr과 동일한 역할을 수행하는 함수

by leo21c 2026. 2. 4.

1. C# 표준 방식: IPAddress.Parse 또는 TryGetAddress

WINAPI의 inet_addr은 "127.0.0.1" 같은 문자열을 32비트 정수(Big-endian)로 변환합니다. C#에서는 System.Net 네임스페이스의 IPAddress 클래스를 사용합니다.

using System.Net;

string ipString = "192.168.0.1";

// 방법 1: Parse (형식이 틀리면 예외 발생)
IPAddress ip = IPAddress.Parse(ipString);

// 방법 2: TryParse (안전한 방법, 추천)
if (IPAddress.TryParse(ipString, out IPAddress ipAddress))
{
    // 정수형 데이터가 필요할 경우 (Address 속성은 구버전에서 사용, 현재는 GetAddressBytes 권장)
    byte[] bytes = ipAddress.GetAddressBytes(); 
    // 호스트 바이트 순서 등으로 변환이 필요하면 여기서 처리
}

2. WINAPI inet_addr과 똑같은 결과값 얻기

inet_addr은 결과값으로 uint(또는 long) 타입의 값을 반환합니다. 이를 완벽하게 재현하려면 다음과 같이 코딩합니다.

using System;
using System.Net;

public static uint InetAddr(string ipAddress)
{
    if (IPAddress.TryParse(ipAddress, out IPAddress ip))
    {
        // GetAddressBytes()는 네트워크 바이트 순서(Big-endian)로 배열을 반환합니다.
        byte[] bytes = ip.GetAddressBytes();
        
        // inet_addr은 32비트 unsigned int 값을 반환하므로 변환해줍니다.
        return BitConverter.ToUInt32(bytes, 0);
    }
    return 0xFFFFFFFF; // INADDR_NONE 값 (실패 시)
}

3. 꼭 WINAPI를 직접 사용해야 하는 경우 (P/Invoke)

기존 C++ 라이브러리와의 호환성 때문에 반드시 원래의 ws2_32.dll에 있는 함수를 호출해야 한다면 P/Invoke를 사용합니다.

using System.Runtime.InteropServices;

class NativeMethods
{
    [DllImport("ws2_32.dll", CharSet = CharSet.Ansi)]
    public static extern uint inet_addr(string cp);
}

// 사용 예시
uint result = NativeMethods.inet_addr("192.168.0.1");

💡 개발 설계 조언 (Substation/Recloser 관련)

작성해주신 코드에서 GetByteStringToIP 함수를 사용 중이신데, 전력 설비(Substation Automation) 프로토콜은 Endian(바이트 순서) 처리가 매우 중요합니다.

  1. Endian 확인: inet_addr은 기본적으로 네트워크 바이트 순서(Big-endian)를 따릅니다. C#의 BitConverter는 CPU 아키텍처(대부분 Little-endian)를 따르므로, 통신 패킷을 만들 때는 IPAddress.HostToNetworkOrder 또는 Array.Reverse를 사용하여 바이트 순서를 명확히 제어해야 합니다.
  2. MAUI/모바일 고려: 모바일 앱 환경에서는 P/Invoke를 통한 DLL 호출이 제한될 수 있습니다. 따라서 가급적 IPAddress.TryParse와 같은 관리형(Managed) 코드를 사용하는 것이 플랫폼 간 이식성(Windows, Android, iOS) 면에서 훨씬 유리합니다.
LIST