Q&A

  • 자기 컴퓨터에 연결되어있는 다른 컴퓨터를 검색할려면..
허브를 사용하여 여러대의 컴퓨터를 연결하는 경우에

자기컴퓨터에 연결되어 있는 다른 컴퓨터가 무었인지

알고 싶을때 어떻게 해야 하죠?



가령 6대의 컴퓨터가 연결되어 있으면, 각각의

컴퓨터 이름, 그 컴퓨터의 ip번호를 알아내는 경우입니다.



클라이언트와 서버일 경우에는 서버에게 지금 접속한

클라이언트들이 무었인지 질문을 할수 있지만

동등한 조건으로 연결되어있으면 직접 검색을 해야 할까요?



그럼 좋은 시간 되세요.

답변도 부탁드립니다.

1  COMMENTS
  • Profile
    김태균 1999.09.01 21:39
    이게 도움이 될런지 모르겠네요.

    이웃 컴퓨터를 찾는 겁니다.

    인터넷이서 다운받은 팁인고 예전에 실행해 봤는데 에러 없이 잘 되더군요.



    unit netres_main_unit;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

    Dialogs,

    ComCtrls, StdCtrls, Buttons, Menus, ExtCtrls;



    type

    TfrmMain = class(TForm)

    tvResources: TTreeView;

    btnOK: TBitBtn;

    btnClose: TBitBtn;

    Label1: TLabel;

    barBottom: TStatusBar;

    popResources: TPopupMenu;

    mniExpandAll: TMenuItem;

    mniCollapseAll: TMenuItem;

    mniSaveToFile: TMenuItem;

    mniLoadFromFile: TMenuItem;

    grpListType: TRadioGroup;

    grpResourceType: TRadioGroup;

    dlgOpen: TOpenDialog;

    dlgSave: TSaveDialog;

    procedure FormCreate(Sender: TObject);

    procedure btnCloseClick(Sender: TObject);

    procedure FormShow(Sender: TObject);

    procedure mniExpandAllClick(Sender: TObject);

    procedure mniCollapseAllClick(Sender: TObject);

    procedure mniSaveToFileClick(Sender: TObject);

    procedure mniLoadFromFileClick(Sender: TObject);

    procedure btnOKClick(Sender: TObject);

    private

    ListType, ResourceType: DWORD;

    procedure ShowHint(Sender: TObject);

    procedure DoEnumeration;

    procedure DoEnumerationContainer(NetResContainer: TNetResource);

    procedure AddContainer(NetRes: TNetResource);

    procedure AddShare(TopContainerIndex: Integer; NetRes:

    TNetResource);

    procedure AddShareString(TopContainerIndex: Integer; ItemName:

    String);

    procedure AddConnection(NetRes: TNetResource);

    public

    { Public declarations }

    end;



    var

    frmMain: TfrmMain;



    implementation



    {$R *.DFM}



    procedure TfrmMain.ShowHint(Sender: TObject);

    begin

    barBottom.Panels.Items[0].Text:=Application.Hint;

    end;



    procedure TfrmMain.FormCreate(Sender: TObject);

    begin

    Application.OnHint:=ShowHint;

    barBottom.Panels.Items[0].Text:='';

    end;



    procedure TfrmMain.btnCloseClick(Sender: TObject);

    begin

    Close;

    end;



    {

    Enumerate through all network resources:

    }

    procedure TfrmMain.DoEnumeration;

    var

    NetRes: Array[0..2] of TNetResource;

    Loop: Integer;

    r, hEnum, EntryCount, NetResLen: DWORD;

    begin

    case grpListType.ItemIndex of

    { Connected resources: }

    1: ListType:=RESOURCE_CONNECTED;

    { Persistent resources: }

    2: ListType:=RESOURCE_REMEMBERED;

    { Global: }

    else ListType:=RESOURCE_GLOBALNET;

    end;



    case grpResourceType.ItemIndex of

    { Disk resources: }

    1: ResourceType:=RESOURCETYPE_DISK;

    { Print resources: }

    2: ResourceType:=RESOURCETYPE_PRINT;

    { All: }

    else ResourceType:=RESOURCETYPE_ANY;

    end;



    Screen.Cursor:=crHourGlass;



    try

    { Delete any old items in the tree view: }

    for Loop:=tvResources.Items.Count-1 downto 0 do

    tvResources.Items[Loop].Delete;

    except

    end;



    { Start enumeration: }

    r:=WNetOpenEnum(ListType,ResourceType,0,nil,hEnum);

    if r<>NO_ERROR then

    begin

    if r=ERROR_EXTENDED_ERROR then

    MessageDlg('Unable to Enumerate the Network.'+#13+

    'A network-specific error occurred.',mtError,[mbOK],0)

    else

    MessageDlg('Unable to Enumerate the Network.',

    mtError,[mbOK],0);

    Exit;

    end;



    try

    { We got a valid enumeration handle; walk the resources: }

    while (1=1) do

    begin

    EntryCount:=1;

    NetResLen:=SizeOf(NetRes);

    r:=WNetEnumResource(hEnum,EntryCount,@NetRes,NetResLen);

    case r of

    0: begin

    { It's a container, iterate it: }

    if NetRes[0].dwUsage=RESOURCEUSAGE_CONTAINER then

    DoEnumerationContainer(NetRes[0])

    else

    { Persistent and connected resources show up here: }

    if ListType in [RESOURCE_REMEMBERED,RESOURCE_CONNECTED]

    then

    AddConnection(NetRes[0]);

    end;



    { Done: }

    ERROR_NO_MORE_ITEMS: Break;

    { Other error: }

    else begin

    MessageDlg('Error Walking Resources.',mtError,[mbOK],0);

    Break;

    end;

    end;

    end;



    finally

    Screen.Cursor:=crDefault;

    { Close enumeration handle: }

    WNetCloseEnum(hEnum);

    end;

    end;



    {

    Enumerate through the specified container:

    This function is usually recursively called.

    }

    procedure TfrmMain.DoEnumerationContainer(NetResContainer:

    TNetResource);

    var

    NetRes: Array[0..10] of TNetResource;

    TopContainerIndex: Integer;

    r, hEnum, EntryCount, NetResLen: DWORD;

    begin

    { Add container name to tree view: }

    AddContainer(NetResContainer);

    { Keep track of this item as current root: }

    TopContainerIndex:=tvResources.Items.Count-1;

    { Start enumeration: }

    if ListType=RESOURCE_GLOBALNET then

    { Enumerating global net: }

    r:=WNetOpenEnum(ListType,ResourceType,RESOURCEUSAGE_CONTAINER,

    @NetResContainer,hEnum)

    else

    { Enumerating connections or persistent (won't normally get here):

    }

    r:=WNetOpenEnum(ListType,ResourceType,RESOURCEUSAGE_CONTAINER,

    nil,hEnum);

    { Couldn't enumerate through this container; just make a note

    of it and continue on: }

    if r<>NO_ERROR then

    begin

    AddShareString(TopContainerIndex,'
    (Error #'+

    IntToStr(r)+'>');

    WNetCloseEnum(hEnum);

    Exit;

    end;



    { We got a valid enumeration handle; walk the resources: }

    while (1=1) do

    begin

    EntryCount:=1;

    NetResLen:=SizeOf(NetRes);

    r:=WNetEnumResource(hEnum,EntryCount,@NetRes,NetResLen);

    case r of

    0: begin

    { Yet another container to enumerate; call this function

    recursively to handle it: }

    if (NetRes[0].dwUsage=RESOURCEUSAGE_CONTAINER) or

    (NetRes[0].dwUsage=10) then

    DoEnumerationContainer(NetRes[0])

    else

    case NetRes[0].dwDisplayType of

    { Top level type: }

    RESOURCEDISPLAYTYPE_GENERIC,

    RESOURCEDISPLAYTYPE_DOMAIN,

    RESOURCEDISPLAYTYPE_SERVER: AddContainer(NetRes[0]);

    { Share: }

    RESOURCEDISPLAYTYPE_SHARE:

    AddShare(TopContainerIndex,NetRes[0]);

    end;

    end;

    ERROR_NO_MORE_ITEMS: Break;

    else begin

    MessageDlg('Error #'+IntToStr(r)+' Walking

    Resources.',mtError,[mbOK],0);

    Break;

    end;

    end;

    end;



    { Close enumeration handle: }

    WNetCloseEnum(hEnum);

    end;



    procedure TfrmMain.FormShow(Sender: TObject);

    begin

    DoEnumeration;

    end;



    {

    Add item to tree view; indicate that it is a container:

    }

    procedure TfrmMain.AddContainer(NetRes: TNetResource);

    var

    ItemName: String;

    begin

    ItemName:=Trim(String(NetRes.lpRemoteName));

    if Trim(String(NetRes.lpComment))<>'' then

    begin

    if ItemName<>'' then ItemName:=ItemName+' ';

    ItemName:=ItemName+'('+String(NetRes.lpComment)+')';

    end;

    tvResources.Items.Add(tvResources.Selected,ItemName);

    end;



    {

    Add child item to container denoted as current top:

    }

    procedure TfrmMain.AddShare(TopContainerIndex: Integer; NetRes:

    TNetResource);

    var

    ItemName: String;

    begin

    ItemName:=Trim(String(NetRes.lpRemoteName));

    if Trim(String(NetRes.lpComment))<>'' then

    begin

    if ItemName<>'' then ItemName:=ItemName+' ';

    ItemName:=ItemName+'('+String(NetRes.lpComment)+')';

    end;



    tvResources.Items.AddChild(tvResources.Items[TopContainerIndex],ItemName);

    end;



    {

    Add child item to container denoted as current top;

    this just adds a string for purposes such as being unable

    to enumerate a container. That is, the container's shares

    are not accessible to us.

    }

    procedure TfrmMain.AddShareString(TopContainerIndex: Integer;

    ItemName: String);

    begin



    tvResources.Items.AddChild(tvResources.Items[TopContainerIndex],ItemName);

    end;



    {

    Add a connection to the tree view.

    Mostly used for persistent and currently connected

    resources to be displayed.

    }

    procedure TfrmMain.AddConnection(NetRes: TNetResource);

    var

    ItemName: String;

    begin

    ItemName:=Trim(String(NetRes.lpLocalName));

    if Trim(String(NetRes.lpRemoteName))<>'' then

    begin

    if ItemName<>'' then ItemName:=ItemName+' ';

    ItemName:=ItemName+'-> '+Trim(String(NetRes.lpRemoteName));

    end;

    tvResources.Items.Add(tvResources.Selected,ItemName);

    end;



    {

    Expand all containers in the tree view:

    }

    procedure TfrmMain.mniExpandAllClick(Sender: TObject);

    begin

    tvResources.FullExpand;

    end;



    {

    Collapse all containers in the tree view:

    }

    procedure TfrmMain.mniCollapseAllClick(Sender: TObject);

    begin

    tvResources.FullCollapse;

    end;



    {

    Allow saving of tree view to a file:

    }

    procedure TfrmMain.mniSaveToFileClick(Sender: TObject);

    begin

    if dlgSave.Execute then

    tvResources.SaveToFile(dlgSave.FileName);

    end;



    {

    Allow loading of tree view from a file:

    }

    procedure TfrmMain.mniLoadFromFileClick(Sender: TObject);

    begin

    if dlgOpen.Execute then

    tvResources.LoadFromFile(dlgOpen.FileName);

    end;



    {

    Rebrowse:

    }

    procedure TfrmMain.btnOKClick(Sender: TObject);

    begin

    DoEnumeration;

    end;



    end.