cooper 的个人资料COOPER SHARE SPACE照片日志列表更多 工具 帮助

日志


2009/2/3

如何獲取網卡資訊 get ip address MAC address ...

在C++中 可以有許多的方式 去獲得網卡的資訊 甚至去修改以便得到正確ip 並連上internet
什麼是ip mac等等 甚至什麼是OSI(Open system Interconnection) 那就查google吧 這只著重在codeing 只是自己做個紀錄
參照的方式 主要是mdsn上範例 調用iphlpapi 可實現不重開機而修改ip等 所以使用iphlpapi很方便 許多的應用程式都使用
其他也有用WMI 或是其他方式 用wmi也很方便 有空再介紹
 
首先考參考msdn 可查詢iphelpapi function http://msdn.microsoft.com/en-us/library/aa366071(VS.85).aspx 中有說明
使用iphlpapi 以下程式節錄mdsn 調用方式很簡單 這方式在VC6  或 vs2005 C++ 都適用
 
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int __cdecl main()
{
    /* Declare and initialize variables */
// It is possible for an adapter to have multiple
// IPv4 addresses, gateways, and secondary WINS servers
// assigned to the adapter.
//
// Note that this sample code only prints out the
// first entry for the IP address/mask, and gateway, and
// the primary and secondary WINS server for each adapter.
    PIP_ADAPTER_INFO pAdapterInfo;
    PIP_ADAPTER_INFO pAdapter = NULL;
    DWORD dwRetVal = 0;
    UINT i;
/* variables used to print DHCP time info */
    struct tm newtime;
    char buffer[32];
    errno_t error;
    ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
    pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO));
    if (pAdapterInfo == NULL) {
        printf("Error allocating memory needed to call GetAdaptersinfo\n");
        return 1;
    }
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        FREE(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
        if (pAdapterInfo == NULL) {
            printf("Error allocating memory needed to call GetAdaptersinfo\n");
            return 1;
        }
    }
    if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
        pAdapter = pAdapterInfo;       //這裡就可以得到adapter info. 有幾張都可以從這獲得by cooper
        while (pAdapter) {
            printf("\tComboIndex: \t5d\n", pAdapter->ComboIndex);
            printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);       //adapter 名字 by cooper
            printf("\tAdapter Desc: \t%s\n", pAdapter->Description);       //adapter Description by cooper
            printf("\tAdapter Addr: \t");       //MAC Address 這裡for loop 是把它轉成16位元 如xx-xx-xx-xx-xx-xx by cooper
            for (i = 0; i < pAdapter->AddressLength; i++) {
                if (i == (pAdapter->AddressLength - 1))
                    printf("%.2X\n", (int) pAdapter->Address[i]);
                else
                    printf("%.2X-", (int) pAdapter->Address[i]);
            }
            printf("\tIndex: \t%d\n", pAdapter->Index);
            printf("\tType: \t");
            switch (pAdapter->Type) {      //這裡是網路連結的型態 by cooper

            case MIB_IF_TYPE_OTHER:
                printf("Other\n");
                break;
            case MIB_IF_TYPE_ETHERNET:
                printf("Ethernet\n");
                break;
            case MIB_IF_TYPE_TOKENRING:
                printf("Token Ring\n");
                break;
            case MIB_IF_TYPE_FDDI:
                printf("FDDI\n");
                break;
            case MIB_IF_TYPE_PPP:
                printf("PPP\n");
                break;
            case MIB_IF_TYPE_LOOPBACK:
                printf("Lookback\n");
                break;
            case MIB_IF_TYPE_SLIP:
                printf("Slip\n");
                break;
            default:
                printf("Unknown type %ld\n", pAdapter->Type);
                break;
            }
            printf("\tIP Address: \t%s\n",
                   pAdapter->IpAddressList.IpAddress.String);       //這是IP Address by cooper
            printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);       //這是IP Mask by cooper
            printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);       //這是 Gateway by cooper
            printf("\t***\n");
            if (pAdapter->DhcpEnabled) {       //這是DHCP by cooper
                printf("\tDHCP Enabled: Yes\n");
                printf("\t  DHCP Server: \t%s\n",
                       pAdapter->DhcpServer.IpAddress.String);
                printf("\t  Lease Obtained: ");
                /* Display local time */
                error = _localtime32_s(&newtime, &pAdapter->LeaseObtained);
                if (error)
                    printf("Invalid Argument to _localtime32_s\n");
                else {
                    // Convert to an ASCII representation
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_s\n");
                    else
                        /* asctime_s returns the string terminated by \n\0 */
                        printf("%s", buffer);
                }
                printf("\t  Lease Expires:  ");
                error = _localtime32_s(&newtime, &pAdapter->LeaseExpires);
                if (error)
                    printf("Invalid Argument to _localtime32_s\n");
                else {
                    // Convert to an ASCII representation
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_s\n");
                    else
                        /* asctime_s returns the string terminated by \n\0 */
                        printf("%s", buffer);
                }
            } else
                printf("\tDHCP Enabled: No\n");
            if (pAdapter->HaveWins) {
                printf("\tHave Wins: Yes\n");
                printf("\t  Primary Wins Server:    %s\n",
                       pAdapter->PrimaryWinsServer.IpAddress.String);
                printf("\t  Secondary Wins Server:  %s\n",
                       pAdapter->SecondaryWinsServer.IpAddress.String);
            } else
                printf("\tHave Wins: No\n");
            pAdapter = pAdapter->Next;
            printf("\n");
        }
    } else {
        printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);
    }
    if (pAdapterInfo)
        FREE(pAdapterInfo);
    return 0;
}
 
code很簡短 主要就是GetAdaptersInfo() 調用iphelpapi後就可使用 其中
PIP_ADAPTER_INFO pAdapterInfo 這結構struct 中紀錄我們local端的網路資訊 這就是我們有的啦
若不懂info.是什麼或是對不對的話 可以打開命令提示字元 或是 開始=>程式集=>執行 鍵入 cmd
然後鍵入 ipconfig /all 就會列出來啦 可以對照看看
 
另外再介紹幾個func. 這都可以在msdn上查到 也有sample參考
AddIPAddress() 加入ip address 這要注意一點 若是已有ip 再用的話 就會一張網卡多個IP
DeleteIPAddress() 篩除IP address 若已無ip 會return fail
IpRenewAddress() renew 網路連線 必須有DHCP
IpReleaseAddress() release 已有的連線