본문 바로가기

4.개발 및 운영 환경

Win32 NIC 인터페이스 정보 얻기

작성일: 2009.04.21 (http://ospace.tistory.com/), ospace114@엠팔.컴

인터페이스 관련 API

API 명
Flatform 설명 비고
GetFriendlyIfIndex Win98 이상/NT sp4 이상 인터페이스 인덱스 받아서 하위호환된 인터페이스 인덱스를 반환. 24비트 이하로된 값.
GetIfEntry Win98 이상/NT sp4 이상 특정 인터페이스 정보를 획득.
GetIfTable Win98 이상/NT sp4 이상 MIB-II 인터페이스 테이블를 획득. GetIfEntry에서 각각 인터페이스 목록을 가져옴.
GetInterfaceInfo Win98 이상/Win 2k 이상 인터페이스 목록을 얻음.
GetNumberOfInterfaces Win98 이상/NT sp4 이상 인터페이스 개수를 얻음.
SetIfEntry Win98 이상/NT sp4 이상 인터페이스의 관리 상태를 설정

환경 요구사항:

  • 헤더: Iphlpapi.h
  • 라이브러리: Iphlpapi.lib

관련 구조체

MIB_IFROW 구조체

  • 관련API: GetIfEntry,
typedef struct _MIB_IFROW {
WCHAR wszName[MAX_INTERFACE_NAME_LEN]; // 유니코드 인터페이스 이름
DWORD dwIndex; // 인터페이스 식별하는 값
DWORD dwType;  // 인터페이스 타입 (아래 참조)
DWORD dwMtu; // MTU(최대 전송 단위)
DWORD dwSpeed; // 인터페이스 속도, bps
DWORD dwPhysAddrLen; // bPhysAddr의 멤버 개수
BYTE bPhysAddr[MAXLEN_PHYSADDR]; // 물리주소
DWORD dwAdminStatus;  // administratively 가능, 불가능 지정
DWORD dwOperStatus; // 인터페이스 작동 상태 (아래 참조)
DWORD dwLastChange; // 작동 상태가 변경된 최근 시간
DWORD dwInOctets;  // 수신된 데이터 옥텍 수
DWORD dwInUcastPkts; // 수신된 유니케스트 옥텍 수
DWORD dwInNUcastPkts; // 수신된 유니케스트가 아닌 옥텍 수
DWORD dwInDiscards;  // 에러가 없이 수신되도 취소된 패킷 수
DWORD dwInErrors;  // 에러로 최소된 수신 패킷 수
DWORD dwInUnknownProtos;  // 프로토콜을 알지 못해 최소된 수신 패킷 수
DWORD dwOutOctets;  // 전송된 데이터 옥텍 수
DWORD dwOutUcastPkts;  // 전송된 유니케스트 옥텍 수
DWORD dwOutNUcastPkts; // 전송된 유니케스트가 아닌 옥텍 수
DWORD dwOutDiscards;  // 에러없어도 취소된 출력 옥텍 수
DWORD dwOutErrors;  // 에러로 취소된 출력 옥텍 수
DWORD dwOutQLen;  // 출력 큐 길이
DWORD dwDescrLen; // bDescrip 길이
BYTE bDescr[MAXLEN_IFDESCR]; // 인터페이스 설명
} MIB_IFROW, *PMIB_IFROW;

MIB_IFTABLE 구조체

  • 관련 API: GetIfTable
typedef struct _MIB_IFTABLE {
  DWORD dwNumEntries; // table 엔트리 개수
  MIB_IFROW table[ANY_SIZE]; // 인터페이스 테이블
} MIB_IFTABLE, *PMIB_IFTABLE;

IP_ADAPTER_INDEX_MAP 구조체

  • 관련 API: GetInterfaceInfo
typedef struct _IP_ADAPTER_INDEX_MAP {
  ULONG Index; // 어뎁터에 연관된 인덱스
  WCHAR Name[MAX_ADAPTER_NAME]; // 유니코드 어뎁터 이름
} IP_ADAPTER_INDEX_MAP, *PIP_ADAPTER_INDEX_MAP;

IP_INTERFACE_INFO 구조체

  • 관련 API: GetInterfaceInfo
typedef struct _IP_INTERFACE_INFO {
  LONG NumAdapters; // 목록에 들어 있는 어뎁터 개수 
  IP_ADAPTER_INDEX_MAP Adapter[1]; // 각 구조체는 어덱터 인덱스를 이름으로 매핑시켜줌.
} IP_INTERFACE_INFO, *PIP_INTERFACE_INFO;

인터페이스 타입

  • 헤더: ipifcons.h
#define MIB_IF_TYPE_OTHER               1  // 기타 등등
#define MIB_IF_TYPE_ETHERNET            6  // 이더넷(무선 포함)
#define MIB_IF_TYPE_TOKENRING           9  // 토큰링
#define MIB_IF_TYPE_FDDI                15 // 광
#define MIB_IF_TYPE_PPP                 23 // PPP
#define MIB_IF_TYPE_LOOPBACK            24 // 루프백 (localloop)
#define MIB_IF_TYPE_SLIP                28 // SLIP

인터페이스 작동 상태

  • 헤더: ipifcons.h
#define IF_OPER_STATUS_NON_OPERATIONAL  0  // 작동 불능 (주소 충돌 등)
#define IF_OPER_STATUS_UNREACHABLE      1  // WAN이 연결 불능
#define IF_OPER_STATUS_DISCONNECTED     2  // LAN 어뎁터인 경우 네트워크 케이블 연결끈김, WAN 어뎁터는 캐리어가 없음.
#define IF_OPER_STATUS_CONNECTING       3  // WAN 어뎁터가 연결중
#define IF_OPER_STATUS_CONNECTED        4  // WAN 어뎁터가 원격 상대방에 연결됨
#define IF_OPER_STATUS_OPERATIONAL      5  // LAN 어뎁터 기본 상태
#define MIB_IF_OPER_STATUS_NON_OPERATIONAL      0
#define MIB_IF_OPER_STATUS_UNREACHABLE          1
#define MIB_IF_OPER_STATUS_DISCONNECTED         2
#define MIB_IF_OPER_STATUS_CONNECTING           3
#define MIB_IF_OPER_STATUS_CONNECTED            4
#define MIB_IF_OPER_STATUS_OPERATIONAL          5

API Signature

DWORD GetFriendlyIfIndex(DWORD IfIndex);

  • 인자:
    IfIndex[in]: 하위호환 혹은 익숙한 인터페이스 인덱스에서의 인터페이스 인덱스
  • 반환:
    성공이면, NO_ERROR를 반환.
    실패면, FormatMessage 함수로 메시지를 얻을 수 있다.

이걸 어떻게 쓰라는 거야 ㅡ.ㅡㅋ

DWORD GetIfEntry(PMIB_IFROW pIfRow);

  • 인자:
    pIfRow[in, out]: pIfRow에서 dwIndex를 설정하면, 해당 인터페이스 정보를 얻을 수 있다.
  • 반환:
    성공이면, NO_ERROR를 반환.
    실패면, FormatMessage 함수로 메시지를 얻을 수 있다.

DWORD GetIfTable(PMIB_IFTABLE pIfTable, PULONG pdwSize, BOOL bOrder);

  • 인자:
    pIfTable[out]: 인터페이스 테이블 목록 버퍼 포인터 (MIB_IFTABLE 구조체)
    pwdSize[in, out]: pIfTable 버퍼 크기, 버퍼가 충분하지 않으면 해당 버퍼 크기 값을 저장. 이때 ERROR_INSUFFICIENT_BUFFER를 리턴.
    bOrder[in]: 인터페이스 테이블을 인덱스에 따라서 오름차순으로 정렬 여부 설정.(true이면 정렬) 특별한 경우가 아니면 정렬할 필요는 없다.
  • 반환:
    함수가 성공이면, NO_ERROR 반환.
    실패면, FormatMessage 함수로 메시지를 얻을 수 있다.

DWORD GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG dwOutBufLen);

  • 인자:
    pfIfTable[out]: 어뎁터 목록이 들어 있는 버퍼 포인터
    dwOutBufLen[in,out]: GetIfTable의 pwdSize와 같다. 역시 버퍼가 충반하지 않으면 알맞는 버퍼크기를 설정한다.
  • 반환:
    함수가 성공이면, NO_ERROR 반환.
    실패면, FormatMessage 함수로 메시지를 얻을 수 있다.

DWORD GetNumberOfInterfaces( PDWORD pdwNumIf );

  • 인자:
    pwdNumIf[out]: 인터페이스 개수
  • 반환:
    함수가 성공이면, NO_ERROR 반환.
    실패면, FormatMessage 함수로 메시지를 얻을 수 있다.

DWORD SetIfEntry( PMIB_IFROW pIfRow );

  • 인자:
    pIfRow[in]: pIfRow의 dwIndex에 해당하는 인터페이스에 관리 상태를 설정. dwAdminStatus 멤버에 새로운 관리 상태를 지정한다.
  • 반환:
    함수가 성공이면, NO_ERROR 반환.
    실패면, FormatMessage 함수로 메시지를 얻을 수 있다.

참조

[1] MSDN

History:

ospace 09.04.21 최초 작성, api 시그니처과 관련 구조체 등을 추가.

반응형

'4.개발 및 운영 환경' 카테고리의 다른 글

NSIS에서 윈도우 방화벽 제어 플러그인  (0) 2009.07.16
Eclipse용 Plugin  (0) 2009.06.19
Windows 버전 정보  (0) 2009.04.13
실행시간 측정  (0) 2009.04.13
VMWare대신 사용할 수 있는 coLinux  (0) 2009.04.06