根据已知IP地址查询局域网中对应网卡的MAC地址

本文探讨如何利用Delphi编程,在Windows环境下通过Socket技术查询局域网内特定IP地址所对应的网卡物理(MAC)地址。
摘要由CSDN通过智能技术生成

请教高手:怎样用Delphi根据已知IP地址查询局域网中对应网卡的MAC地址

问题点数: 0、回复次数: 5
1楼  bluemeteor   ( 挂月||Becoder) 二星用户 该版得分小于等于30000分,大于10000分  回复于  2003-01-23 11:50:50  得分 0

(即在局域网内,知道IP查MAC地址,知道MAC地址查IP)  
  你可以使用arp程序(WINDOWS自带)  
  eg:   arp   -a   192.168.0.1  
   
  如果使用程序查的话,你需要去实现一个ARP、RARP协议的软件  
  如果只是查看一下对应关系,可以登陆到以太网交换机上查看IP和MAC之间的对应  
  在Windows9x中,可按如下思路进行:  
  1、建立局域网内IP地址--MAC地址对照表:  
      调用icmp.dll中的IcmpSendEcho函数对一个地址发一个ping操作。  
      成功后马上调用Iphlpapi.dll中的GetIpNetTable函数来取所有的ARP表,从中找出  
  所关心的MAC地址。  
      保存IP地址和MAC地址。  
      依此类推,取得局域网内所有IP地址和MAC地址的对照表。  
      (可取范围为IPADDR   and   SUBMASK   子网范围内的对照表)  
  2、做一个查询界面。  
   
  Windows2000中,应该可以更简单一些。因为它支持更多的函数如SendARP。  
  IP   to   MAC   较容易:  
  方法1.   DOS命令:   nbtstat   -a   IP  
  方法2.   DOS命令:   ping   IP   然后   arp   -a  
  方法3.   仿照nbtstat,向对方的137端口发数据包,包的内容如下(C代码)  
  BYTE   b[50]={0x0,0x00,0x0,0x10,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,  
                            0x20,0x43,0x4b,0x41,0x41,0x41,0x41,0x41,0x41,0x41,  
                            0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,  
                            0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,  
                            0x41,0x41,0x41,0x0,0x0,0x21,0x0,0x1};  
  (这是发nbtstat命令后用IPMan截获的),对方会向你返回一个数据包,  
  其中有对方的工作组,主机名,用户名,MAC地址。当然,返回包的格式要  
  自己分析,也可以查RFC文档。你自己的端口可以随便取一个值。  
  方法4.在win9x下可用IPMan直接发ARP。  
  方法5.在win2000下可用SendArp()直接发ARP。  
  ----------------------------------------------------------------  
  MAC   to   IP似乎较困难。  
  Win9x下IPMan有此项功能,但我试了一下似乎不行。  
   
   
  来自:zw84611,   时间:2001-10-7   19:37:00,   ID:659172  
  发出去了,是用VC写的。因为我不喜欢Delphi5   的udp控件。其实用delphi也一样。很  
  简单的,就是向对方137端口发内容为  
  BYTE   b[50]={0x0,0x00,0x0,0x10,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,  
                            0x20,0x43,0x4b,0x41,0x41,0x41,0x41,0x41,0x41,0x41,  
                            0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,  
                            0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,  
                            0x41,0x41,0x41,0x0,0x0,0x21,0x0,0x1};  
  的UDP包(Delphi中用$代替0x),对方就会给你应答,你接收就是了。  
   
  Delphi源码如下,其中UDP用Socket   API实现。  
  -------------------------------------------------------  
   
  unit   udp;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,   winsock,  
      StdCtrls;  
   
  const  
      WM_SOCK   =   WM_USER   +   1;           //自定义windows消息  
      UDPPORT   =   6767;                         //设定UDP端口号  
      NBTPORT   =   137;  
   
  type  
      Tfrmmain   =   class(TForm)  
          Button1:   TButton;  
          ListBox1:   TListBox;  
          Edit1:   TEdit;  
          procedure   FormCreate(Sender:   TObject);  
          procedure   FormClose(Sender:   TObject;   var   Action:   TCloseAction);  
          procedure   Button1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
          s:   TSocket;  
          addr:   TSockAddr;  
          FSockAddrIn   :   TSockAddrIn;   //利用消息实时获知UDP消息  
          procedure   ReadData(var   Message:   TMessage);   message   WM_SOCK;  
      public  
          {   Public   declarations   }  
          procedure   SendData(b:array   of   byte);  
      end;  
   
  var  
      frmmain:   Tfrmmain;  
   
  implementation  
   
  {$R   *.DFM}  
   
  procedure   Tfrmmain.FormCreate(Sender:   TObject);  
  var  
        TempWSAData:   TWSAData;  
        //optval:   integer;  
  begin  
            //   初始化SOCKET  
            if   WSAStartup($101,   TempWSAData)=1   then  
                  showmessage('StartUp   Error!');  
   
            s   :=   Socket(AF_INET,   SOCK_DGRAM,   0);  
            if   (s   =   INVALID_SOCKET)   then       //Socket创建失败  
            begin  
                      showmessage(inttostr(WSAGetLastError())+'     Socket创建失败');  
                      CloseSocket(s);  
            end;  
            //本机SockAddr绑定  
            addr.sin_family   :=   AF_INET;  
            addr.sin_addr.S_addr   :=   INADDR_ANY;  
            addr.sin_port   :=   htons(UDPPORT);  
            if   Bind(s,   addr,   sizeof(addr))   <>   0     then  
                begin  
                    showmessage('bind   fail');  
                end;  
            WSAAsyncSelect(s,   frmmain.Handle   ,   WM_SOCK,   FD_READ);  
            //对方SockAddrIn设定  
            FSockAddrIn.SIn_Family   :=   AF_INET;  
            FSockAddrIn.SIn_Port   :=   htons(NBTPORT);  
  end;  
   
  procedure   Tfrmmain.FormClose(Sender:   TObject;   var   Action:   TCloseAction);  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值