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(바이트 순서) 처리가 매우 중요합니다.
- Endian 확인: inet_addr은 기본적으로 네트워크 바이트 순서(Big-endian)를 따릅니다. C#의 BitConverter는 CPU 아키텍처(대부분 Little-endian)를 따르므로, 통신 패킷을 만들 때는 IPAddress.HostToNetworkOrder 또는 Array.Reverse를 사용하여 바이트 순서를 명확히 제어해야 합니다.
- MAUI/모바일 고려: 모바일 앱 환경에서는 P/Invoke를 통한 DLL 호출이 제한될 수 있습니다. 따라서 가급적 IPAddress.TryParse와 같은 관리형(Managed) 코드를 사용하는 것이 플랫폼 간 이식성(Windows, Android, iOS) 면에서 훨씬 유리합니다.
LIST
'.NET' 카테고리의 다른 글
| XDF0003 Microsoft.Windows.Shell 오류 발생 해결 방법 (1) | 2026.01.23 |
|---|---|
| C# float string format 전체 길이와 소수점 자리수 제어 (2) | 2025.07.28 |
| C#에서 DllImport를 사용해서 C++ DLL 함수를 호출할 때 진입점 못찾는 문제 관련 dumpbin 사용법 (1) | 2025.07.21 |
| C# Throw 발생 방법 (0) | 2025.05.13 |
| C# 폴더 내부 파일을 다른 폴더로 복사 (0) | 2025.05.13 |