1楼
bluemeteor (
挂月||Becoder)
![二星用户 该版得分小于等于30000分,大于10000分](http://topic.csdn.net/Include/RankImages/star2.gif)
回复于
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);