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 已有的連線
     
     

    评论

    请稍候...
    很抱歉,您输入的评论太长。请缩短您的评论。
    您没有输入任何内容,请重试。
    很抱歉,我们当前无法添加您的评论。请稍后重试。
    若要添加评论,需要您的家长授予您相应权限。请求权限
    您的家长禁用了评论功能。
    很抱歉,我们当前无法删除您的评论。请稍后重试。
    您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
    因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
    完成下面的安全检查,您提供评论的过程才能完成。
    您在安全检查中键入的字符必须与图片或音频中的字符一致。

    若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


    还没有 Windows Live ID 吗?请注册

    引用通告

    此日志的引用通告 URL 是:
    http://cooperpeng-yahoomail.spaces.live.com/blog/cns!C658F3D6D3BAC287!270.trak
    引用此项的网络日志