《Windows网络与通信程序设计》——示例:获取MAC地址

来源:互联网 发布:刘路造假事件知乎 编辑:程序博客网 时间:2024/05/22 18:22

示例:获取MAC地址

说明:

下面的例子输出了本机的IP地址、网络(内部 LAN )的子网掩码、网关的lP地址和本机的MAC地址。

 

代码: 

unit uLocalHostInfo;

 

interface

 

uses

    Windows,SysUtils,Classes;

 

procedure GetGlobalData(AList: TStrings);

 

implementation

 

uses WinSock2;

 

const

    MAX_ADAPTER_NAME_LENGTH = 256;

    MAX_ADAPTER_DESCRIPTION_LENGTH = 128;

    MAX_ADAPTER_ADDRESS_LENGTH = 8;

 

type

    PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;

    IP_ADDRESS_STRING = array[0..15] of char; // IP as string

 

    PIP_ADDR_STRING = ^IP_ADDR_STRING;

    IP_ADDR_STRING = record

        Next: PIP_ADDR_STRING;

        IpAddress: IP_ADDRESS_STRING;

        IpMask: IP_ADDRESS_STRING;

        Context: DWORD;

    end;

 

    //---IP_ADAPTER_INFO结构包含了本地计算机上网络适配器的信息

    PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;

    IP_ADAPTER_INFO = record

        Next: PIP_ADAPTER_INFO; //--指向适配器列表中的下一个适配器(计算机可能有多个适配器)

        ComboIndex: DWORD; //--保留字段

        AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char; //--适配器名称

        Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char; //--对适配器的描述

        AddressLength: UINT; //--MAC地址的长度(应为6个字节)

        Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte; //--MAC地址

        Index: DWORD; //--适配器索引

        aType: UINT; //--适配器类型,如MIB_IF_TYPE_ETHERNET

        DHCPEnabled: UINT; //--指定此适配器是否使用了DHCP(动态主机配置)协议

        CurrentIPAddress: PIP_ADDR_STRING; //--保留宇段

        IPAddressList: IP_ADDR_STRING; //--与适配器相关的IP地址列表

        GatewayList: IP_ADDR_STRING; //--网关地址列表

        DHCPServer: IP_ADDR_STRING; //--DHCP服务器

        HaveWINS: BOOL; //--指定此适配器是否使用WINSWindows Internet名称服务)

        PrimaryWINSServer: IP_ADDR_STRING; //--WINS服务器的主IP地址

        SecondaryWINSServer: IP_ADDR_STRING; //--WINS服务器的第二IP地址

        LeaseObtained: LongInt; //--获取当前DHCP租用时间

        LeaseExpires: LongInt; //--当前DHCP租用期满的时间

    end;

 

{

作用:获取本地机器的适配器信息。

函数调用成功返回ERROR_SUCCESS

}

function GetAdaptersInfo(

    pAdapterInfo: PIP_ADAPTER_INFO; //--指向一个缓冲区.用来取得IP_ADAPTER_INFO结构的列表

    pOutBufLen: PULONG //--用来指定上面缓冲区的大小。如果大小不够.此参数返回所需大小

    ): DWORD; stdcall; external 'Iphlpapi.dll' name 'GetAdaptersInfo';

 

procedure GetGlobalData(AList: TStrings);

//--可以通过"ipconfig /all"命令进行验证

var

    g_ucLocalMac: array[0..5] of PChar; // 本地MAC地址

    g_dwGatewayIP: DWORD; // 网关IP地址

    g_dwLocalIP: DWORD; // 本地IP地址

    g_dwMask: DWORD; // 子网掩码

    pAdapterInfo:PIP_ADAPTER_INFO;

    ulLen:ULONG;

    in1: TInAddr;

    p:PChar;

begin

    pAdapterInfo := nil;

    ulLen := 0;

    //---为适配器结构申请内存

    GetAdaptersInfo(pAdapterInfo,@ulLen);

    pAdapterInfo := AllocMem(ulLen);

    //---取得本地适配器结构信息

    if (GetAdaptersInfo(pAdapterInfo,@ulLen) =  ERROR_SUCCESS) then

    begin

        if pAdapterInfo <> nil then

        begin

            move(pAdapterInfo.Address[1],g_ucLocalMac[0],length(g_ucLocalMac));

            g_dwGatewayIP := inet_addr(pAdapterInfo.GatewayList.IpAddress);

            g_dwLocalIP := inet_addr(pAdapterInfo.IpAddressList.IpAddress);

            g_dwMask := inet_addr(pAdapterInfo.IpAddressList.IpMask);

        end;

    end;

    //---

    AList.Add('-------------------- 本地主机信息 -----------------------');

    //---

    in1.S_addr := g_dwLocalIP;

    AList.Add(format('     IP Address : %s',[inet_ntoa(in1)]));

    //---

    in1.S_addr := g_dwMask;

    AList.Add(format('    Subnet Mask : %s',[inet_ntoa(in1)]));

    //---

    in1.S_addr := g_dwGatewayIP;

    AList.Add(format('Default Gateway : %s',[inet_ntoa(in1)]));

    //---

    p := @g_ucLocalMac[0];

    AList.Add(format('    MAC Address : %.2X-%.2X-%.2X-%.2X-%.2X-%.2X',[Ord(p[0]), Ord(p[1]), Ord(p[2]), Ord(p[3]), Ord(p[4]), Ord(p[5])]));

    //---

    FreeMem(pAdapterInfo);

end;

  

end.

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 对公密码器丢了怎么办 手机qq忘记旧密码怎么办 qq旧密码忘记了怎么办 微博账户密码忘记了怎么办 三星盖乐世s3忘记密码了怎么办 微博登录密码忘记了怎么办 助学贷款密码忘了怎么办 助学贷款的密码忘了怎么办 助学贷款登录密码忘了怎么办 抖音换了手机登不了怎么办 微信忘记密码申诉失败怎么办 银行卡短信通知没了怎么办 斗鱼手机号被绑定了怎么办 网易邮箱不记得账号怎么办 qq号被盗申诉不回来怎么办 号被盗了申诉不回来怎么办 富士康离职后工资卡号没填怎么办? 填高考志愿时没填电话号码怎么办 铁路12306密码忘了怎么办 微销通提示网络请求失败怎么办 苹果手机出现不停播报情况怎么办 手做俯卧撑抬不起来怎么办 如果qq号被冻结了怎么办 买的qq号被冻结怎么办 联想平板怎么下载东西怎么办 所有浏览器都安装不了怎么办 忘记微博登录邮箱怎么办 丰巢验证码丢了怎么办 微博昵称忘了怎么办 163邮箱账号忘记了怎么办 苹果手机id邮箱忘记了怎么办 微信号没注销了怎么办 微信昵称换不了怎么办 微博支付密码忘记怎么办 微博支付密码忘记了怎么办 华为手机看不见截屏怎么办 支付宝密码错误被锁定怎么办 实名身份证的微信限额怎么办 工行网银登陆密码忘了怎么办 美亚买的东西坏了怎么办 海带宝转运到香港怎么办