참조 : 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

 

                     :

+ Recent posts