取得远程机器MAC信息的控件

scxxf 2003-08-19 06:37:30
我从网上看到一篇可以取得远程机器的MAC信息源程序,我想把它改写成一个控件,但使用起来有一点问题,请高手改正。
以下为控件源代码:
unit net_info;

interface

uses
Windows, Messages, SysUtils, Classes,winsock,Controls;
const
WM_SOCK = WM_USER + 1; //自定义windows消息
UDPPORT = 6767; //设定UDP端口号
NBTPORT = 137;
type
Tnet_info = class(TComponent)
constructor create(Aowner:Tcomponent);
constructor close;
//procedure FormCreate(sender:Tobject);
//procedure FormClose(Sender: TObject);
private
{ Private declarations }
s:TSocket;
addr: TSockAddr;
Freturn,FIP_begin:string;
Fhandle:HWND;
FSockAddrIn : TSockAddrIn; //利用消息实时获知UDP消息
protected
{ Protected declarations }
public
{ Public declarations }
procedure start;
procedure ReadData(var Message: TMessage);
procedure SendData(b:array of byte);
procedure GetInfo(buffer: Array of byte;len:integer);
procedure WndProc(var Message: TMessage); message WM_SOCK;
published
{ Published declarations }
property return:string read Freturn write Freturn;
property IP_begin:string read FIP_begin write FIP_begin;
end;

procedure Register;

implementation

constructor Tnet_info.Create(Aowner:Tcomponent);
var
TempWSAData: TWSAData;
begin
// 初始化SOCKET
inherited create(Aowner);
FHandle := AllocateHWnd(WndProc);
if WSAStartup($101, TempWSAData)=1 then
Freturn:='StartUp Error!';

s:= Socket(AF_INET, SOCK_DGRAM, 0);
if (s = INVALID_SOCKET) then //Socket创建失败
begin
Freturn:=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
Freturn:='bind fail';
end;
WSAAsyncSelect(s,FHandle , WM_SOCK, FD_READ);
//对方SockAddrIn设定
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(NBTPORT);
end;

constructor Tnet_info.close;
begin
CloseSocket(s);
end;

procedure Tnet_info.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_SOCK: ReadData(Message);
end;
end;

procedure Tnet_info.GetInfo(buffer: Array of byte;len:integer);
var
str:string;
i,j,pos,name_num: integer;
begin

name_num:=0;
for i:=1 to len do
begin
if((buffer[i]=$21)and(buffer[i+1]=$00)and(buffer[i+2]=$01))
then
begin
name_num:=buffer[i+9];
break;
end;
end;
if name_num=0 then exit;
pos:=i+10;

str:='';
for i:=pos to (pos+18*name_num-1) do
begin
if (((i-pos)mod 18) =0) then
begin
for j:=0 to 14 do
begin
if trim(char(buffer[i+j]))='' then buffer[i+j]:=ord(' ');
str:=str+char(buffer[i+j]);
end;
if (buffer[i+16] and $80)=$80 then
begin
str:=str+format('<%x>',[buffer[i+15]]);
Freturn:=str+'<GROUP>';
end
else
begin
str:=str+format('<%x>',[buffer[i+15]]);
Freturn:=str+'<UNIQUE>';
end;
str:='';
end;
end;

for i:=0 to 5 do
begin
str:=str+format('%.2x.',[buffer[i+pos+18*name_num]]);
end;
delete(str,length(str),1);
return:='MAC:'+str;
end;

procedure Tnet_info.ReadData(var Message: TMessage);
var
buffer: Array [1..500] of byte;
len{,i}: integer;
flen: integer;
Event: word;
value: string;

begin
value:='';
flen:=sizeof(FSockAddrIn);
FSockAddrIn.SIn_Port := htons(NBTPORT);
Event := WSAGetSelectEvent(Message.LParam);
if Event = FD_READ then
begin
len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
if len<> 0 then GetInfo(buffer,len);
end;
end;

procedure Tnet_info.SendData(b:array of byte);
var
len: integer;
begin

FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(FIP_begin));
len := sendto(s, b[0],50, 0, FSockAddrIn, sizeof(FSockAddrIn));
if len = SOCKET_ERROR then
return:='send fail';
if len <> 50 then
return:='Not Send all';
end;

procedure Tnet_info.start;
const NbtstatPacket:array[0..49]of byte
=($0,$0,$0,$10,$0,$1,
$0,$0,$0,$0,$0,$0,$20,$43,$4b,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$41,$41,
$41,$41,$41,$41,$41,$41,$0,$0,$21,$0,$1);
begin

senddata(NbtstatPacket);

end;
procedure Register;
begin
RegisterComponents('scxxf', [Tnet_info]);
end;

end.
...全文
25 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
scxxf 2003-08-31
  • 打赏
  • 举报
回复
高手看看啊
scxxf 2003-08-21
  • 打赏
  • 举报
回复
TO: bluespy(自古英雄出我辈, 一入江湖岁月催!) 没试过

有谁可以帮我看看问题出在什么地方?帮我改一改。
kuan 2003-08-20
  • 打赏
  • 举报
回复
看看……
bluespy 2003-08-20
  • 打赏
  • 举报
回复
有办法获得真实的mac吗?我是说如果别人手工改了mac你能识别吗?
fuyifan 2003-08-19
  • 打赏
  • 举报
回复
up
scxxf 2003-08-19
  • 打赏
  • 举报
回复
有谁可以帮我改一改?

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧