참조 : http://i0nucleus.egloos.com/2957944
================================================================================================================
[C / WinAPI] Lan 연결 상태 알아내기
랜 선이 연결 여부를 알고 싶을 때가 있습니다. 3가지 방법이 있습니다.
WinXP 와 Win7에서 테스트를 하였습니다. Visual Studio 2005 (콘솔모드)에서 컴파일 하였습니다.
테스트할 때 직접 랜 선을 뽑아가면서 했습니다. 인터넷, MSDN을 찾아가면서 샘플 코드를 만들어 보았습니다. 휴~
[Method 3]은 코드 분석할 때 MSDN을 참조하세요.
각각 나름씩 장단점이 있습니다.
소켓 프로그래밍 할 때 적용해서 프로그램 만들어야 겠어욤.....
더 좋은 방법있으면 알려주세요. 댓글 남겨주세요.
-----------------------------------------------------------------------------------------------------------------
[Method 3]
MIB_IFTABLE, MIB_IFROW 이용하여 랜 상태를 알 수 있습니다. iphlpapi.h 포함.
인터넷과, MSDN을 참조하여 수정하였습니다. 이더넷 관련 모든 장치를 볼 수 있습니다.
코딩이 좀 복잡함, 지연 없음, WinXP, Win7에서 정상적으로 작동함.
[Source Code 3]
#include#include #include #pragma comment(lib, "iphlpapi.lib") #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) #define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) int main() { DWORD dwSize = 0; DWORD dwRetVal = 0; int i; MIB_IFTABLE *pIfTable; MIB_IFROW *pIfRow; pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE)); if (pIfTable == NULL) { printf("Error allocating memory needed to call GetIfTable\n"); exit (1); } dwSize = sizeof (MIB_IFTABLE); if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { FREE(pIfTable); pIfTable = (MIB_IFTABLE *) MALLOC(dwSize); if (pIfTable == NULL) { printf("Error allocating memory\n"); exit (1); } } while(1) { Sleep(500); if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR) { if (pIfTable->dwNumEntries > 0) { pIfRow = (MIB_IFROW *) MALLOC(sizeof (MIB_IFROW)); if (pIfRow == NULL) { printf("Error allocating memory\n"); if (pIfTable != NULL) { FREE(pIfTable); pIfTable = NULL; } exit (1); } for (i = 0; i < (int) pIfTable->dwNumEntries; i++) { pIfRow->dwIndex = pIfTable->table[i].dwIndex; if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR) { if(pIfRow->dwType != MIB_IF_TYPE_ETHERNET) continue; printf("\n\tIndex:\t %ld\n", pIfRow->dwIndex); printf("\tOper Status[%d]:\t ", i); switch (pIfRow->dwOperStatus) { case MIB_IF_OPER_STATUS_NON_OPERATIONAL: printf("Non Operational\n"); break; case MIB_IF_OPER_STATUS_OPERATIONAL: printf("Operational\n"); break; default: printf("Unknown status %ld\n", pIfRow->dwAdminStatus); break; } } } } } } return 0; }
[Result 3]
Index: 2
Oper Status[0]: Operational
:
Index: 2
Oper Status[0]: Operational
Index: 2
Oper Status[0]: Non Operational
Index: 2
Oper Status[0]: Non Operational
Index: 2
Oper Status[0]: Non Operational
Index: 2
Oper Status[0]: Operational
: