编写程序自动获取局域网中全部机器的ip地址,自动生成网络图
考虑,通过ip广播,获取返回ip地址,但是程序不会写,望指教!

解决方案 »

  1.   

    http://www.loncomip.com/Product/net_work.htm>>自动生成网络图
    以前公司做過, 但無法提供代碼
      

  2.   

    不行啊,眼睛同志,那个网址不可用
    不要代码也行,我就是有一个设备的ip地址不知道,现在最着急的是找出她的ip地址
    不过也想写一个这个东东,免得以后麻烦,如果好用的话就和大家共享,呵呵
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,Winsock, Sockets, ComCtrls, Buttons,shellapi,ComObj,WinInet;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        TreeView2: TTreeView;
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
        function GetLocalName():string;
        function GetLocalIP(aname:string):string;
        procedure GetComputerInGroupName();
        procedure GetGroupName();
        procedure TreeView1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure TreeView2Click(Sender: TObject);
      private
        { Private declarations }
      public    { Public declarations }
      end;
    type
        TNetResourceArray = ^TNetResource;//网络类型的数组var
      Form1: TForm1;
     strr:string;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
     GetGroupName();
    end; function tform1.GetLocalIP (aname:string):string; //»ñÈ¡±¾µØipµØÖ·£»
    type
    TaPInAddr = array [0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    var
    phe  : PHostEnt;
    pptr : PaPInAddr;
    Buffer : array [0..63] of char;
    I    : Integer;
    GInitData      : TWSADATA;begin
    WSAStartup($101, GInitData);
         Result := '';
    StrPCopy(Buffer, AName);
    phe :=GetHostByName(buffer);
    if phe = nil then Exit;
    pptr := PaPInAddr(Phe^.h_addr_list);
    I := 0;
    while pptr^[I] <> nil do
      begin
    result:=StrPas(inet_ntoa(pptr^[I]^));
    Inc(I);
    end;
    WSACleanup;
    end;function tform1.GetLocalName ():string;//&raquo;&ntilde;&Egrave;&iexcl;±&frac34;&micro;&Oslash;&Ouml;÷&raquo;ú&Atilde;&ucirc;&pound;&raquo;
    var
    pComputerName:pchar ;
    ComputerNameLen:longword;
    begin
    ComputerNameLen:=255;
    GetMem(pComputerName,ComputerNameLen);
    try
    if not GetComputerName(pComputerName,ComputerNameLen) then
    pComputerName:='No computer name';
                    result:=pComputerName;
    finally
    FreeMem(pComputerName);
    End;
    end;procedure tform1.GetGroupName();
    var
      NetResource: TNetResource;
      Buf: Pointer;
      Node: TtreeNode;
      Count, BufSize, Res: DWORD;
      lphEnum: THandle;
      p: TNetResourceArray;
      i, j: SmallInt;
      NetworkTypeList: TList;
      my_node_1: Ttreenode;
    begin
      screen.Cursor := crHourGlass;
      Node :=TreeView1.Selected;
      NetworkTypeList := TList.Create;
      //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
      Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
        RESOURCEUSAGE_CONTAINER, nil, lphEnum);
      if Res <> NO_ERROR then exit; //执行失败
      //获取整个网络中的网络类型信息
      Count := $FFFFFFFF; //不限资源数目
      BufSize := 8192; //缓冲区大小设置为8K
      GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
      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;
      //WNetCloseEnum关闭一个列举句柄
      Res := WNetCloseEnum(lphEnum); //关闭一次列举
      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 := 8192; //缓冲区大小设置为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
            my_node_1 := treeview1.Items.addchild(node, StrPAS(P^.lpRemoteName)); //取得一个工作组的名称
            my_node_1.imageindex := 1;
            Inc(P);
          end;
        end;
        Res := WNetCloseEnum(lphEnum); //关闭一次列举
        if Res <> NO_ERROR then break; //执行失败
      end;
      FreeMem(Buf);
      NetworkTypeList.Destroy;
      screen.Cursor := crDefault;
    end;//获取计算机名
    procedure tform1.GetComputerInGroupName();
    var
      NetResource: TNetResource;
      Buf: Pointer;
      Count, BufSize, Res: DWord;
      Ind: Integer;
      lphEnum: THandle;
      Temp: TNetResourceArray;
      groupname: string;
      my_node: Ttreenode;
      my_node_2: Ttreenode;
    begin
      screen.Cursor := crHourGlass;
      my_node := treeview2.Selected;
      groupname:= treeview1.Selected.text;
      FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息
      NetResource.lpRemoteName := @GroupName[1]; //指定工作组名称
      NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //类型为服务器(工作组)
      NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
      NetResource.dwScope := RESOURCETYPE_DISK; //列举文件资源信息
      //获取指定工作组的网络资源句柄
      Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
        RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);  if Res <> NO_ERROR then Exit; //执行失败
      while True do //列举指定工作组的网络资源
      begin
        Count := $FFFFFFFF; //不限资源数目
        BufSize := 8192; //缓冲区大小设置为8K
        GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
       //获取计算机名称
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);    if Res = ERROR_NO_MORE_ITEMS then break; //资源列举完毕
        if (Res <> NO_ERROR) then Exit; //执行失败
       Temp := TNetResourceArray(Buf);   for Ind := 0 to Count - 1 do //列举工作组的计算机名称
        begin
          //获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun
          my_node_2 := treeview2.Items.AddChild(my_node, Temp^.lpRemoteName + 2);
          my_node_2.imageindex := 2;
            Inc(Temp);
        end;
      end;
      Res := WNetCloseEnum(lphEnum); //关闭一次列举
      if Res <> NO_ERROR then exit; //执行失败
      FreeMem(Buf);
      screen.Cursor := crDefault;
    end;
    procedure TForm1.TreeView1Click(Sender: TObject);
    begin
     TreeView2.Items.Clear;
     GetComputerInGroupName();
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    close;
    end;procedure TForm1.TreeView2Click(Sender: TObject);
    begin
    edit1.Text:=GetLocalIP(TreeView2.Selected.Text)
    end;end.