怎样获取局域网内所有机器的名字及IP地址?

liushikui 2001-09-25 02:12:34
...全文
262 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
韩小明 2001-09-25
  • 打赏
  • 举报
回复
gz
shdharmer 2001-09-25
  • 打赏
  • 举报
回复
没用的,查找出来的机器名或IP会重复的.
kevin_gao 2001-09-25
  • 打赏
  • 举报
回复
gz
cobi 2001-09-25
  • 打赏
  • 举报
回复
以前我也回答过这样的问题,也提供了例程,查找一下帖子吧
sundayboys 2001-09-25
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls ,winsock;

type
TNetResourceArray = ^TNetResource; //网络资源类型的数组
TForm1 = class(TForm)
Memo1: TMemo;
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
function GetIP(Sender: TObject; fcomputername:string) :string;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

//函数GetServerList列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,
Function GetServerList( var List : TStringList ) : Boolean; //参数List中返回服务器(工作组)的名称
Var
NetResource : TNetResource;
Buf : Pointer;
Count,BufSize,Res : DWORD;
lphEnum : THandle;
p:TNetResourceArray;
i,j : SmallInt;
NetworkTypeList : TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum); //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
If Res <> NO_ERROR Then
exit; //执行失败,退出
Count := $FFFFFFFF; //执行成功,开始获取整个网络中的网络类型信息
BufSize := 8192; //不限资源数目
GetMem(Buf, BufSize); //缓冲区大小设置为8K
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//申请内存,用于获取工作组信息
If ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) Then //资源列举完毕
Exit; //执行失败
P := TNetResourceArray(Buf);
For I := 0 To Count - 1 Do //记录各个网络类型的信息
Begin
NetworkTypeList.Add(p);
Inc(P);
End;
Res:= WNetCloseEnum(lphEnum); //WNetCloseEnum关闭一个列举句柄
If Res <> NO_ERROR Then
exit;
For J := 0 To NetworkTypeList.Count-1 Do //列出各个网络类型中的所有工作组名称
Begin
NetResource := TNetResource(NetworkTypeList.Items[J]^);//列出一个网络类型中的所有工作组名称 //网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
If Res <> NO_ERROR Then
break; //执行失败
While true Do //列举一个网络类型的所有工作组的信息
Begin
Count := $FFFFFFFF; //不限资源数目
BufSize := 1024*16; //缓冲区大小设置为8K
GetMem(Buf, BufSize); //申请内存,用于获取工作组信息,获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR) then //资源列举完毕
break; //执行失败
P := TNetResourceArray(Buf);
For I := 0 To Count - 1 Do //列举各个工作组的信息
Begin
List.Add( StrPAS( P^.lpRemoteName ));
//取得一个工作组的名称
Inc(P);
End;
End;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
If Res <> NO_ERROR Then
break; //执行失败
End;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;

function TForm1.GetIP(Sender: TObject; fcomputername:string) :string;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
begin
HostEnt := nil;
WSAStartup(2, WSAData);
HostEnt := gethostbyname(PChar(fComputerName));
if HostEnt <> nil then
begin
with HostEnt^ do
result:= Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]),Byte(h_addr^[3])]);
end;
WSACleanup;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
sl,s2:TstringList;
i,j,k:integer;
temp:string;
begin
temp:='d:\computer.txt';
memo1.lines.Clear;
sl:=Tstringlist.create;
s2:=Tstringlist.create;
try
if GetServerList(sl) then
begin
for i:=0 to sl.count-1 do
begin
memo1.lines.Add (sl.Strings[i]+':');
try
winexec(pchar('command.com /C net view /workgroup:'+sl.Strings[i]+' >'+temp),sw_hide);
except
end;
k:=120;
repeat;
sleep(k);
k:=k+40;
until
fileexists(temp);
s2.LoadFromFile(temp);
for j:=1 to s2.count-1 do
begin
if pos(':',s2.Strings[j]) >0 then
memo1.lines.Add (s2.Strings[j]);
if pos('\\',s2.Strings[j]) >0 then
memo1.lines.Add (' '+copy(s2.Strings[j],1,15)+' IP: '+ GetIP(Sender,trim(copy(s2.Strings[j],3,20))));
end;
end;
memo1.lines.Add('工作组个数:'+inttostr(sl.count));
end
else
memo1.lines.Add('没有找到工作组!');
except
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.lines.Clear;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
memo1.lines.SaveToFile('LKnet.spl');
action:=cafree;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
IF fileexists('LKnet.spl') then
Memo1.Lines.LoadFromFile('LKnet.spl');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if pos('工作组个数', memo1.Text) =0 then
button1click(sender);
end;

end.

还是多看看以前的帖子。

5,386

社区成员

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

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