Q&A

  • IP가 살았는지 죽었는지 체크방법
컴퓨터가 네트워크에 참여하고 있는지 알고 싶어요... 간단한 방법 없을까요?

ping을 사용하여 봤지만....

죽어있을 경우에는 확인하는데 시간이 너무 걸리더라구요....

제 경우에는 ip체크만 합니다....

부탁드릴께요... 그럼 수고하십시오~~

3  COMMENTS
  • Profile
    김영대 1999.09.15 22:43
    이광주 wrote:

    > 컴퓨터가 네트워크에 참여하고 있는지 알고 싶어요... 간단한 방법 없을까요?

    > ping을 사용하여 봤지만....

    > 죽어있을 경우에는 확인하는데 시간이 너무 걸리더라구요....

    > 제 경우에는 ip체크만 합니다....

    > 부탁드릴께요... 그럼 수고하십시오~~



    원도우즈의 네트워크는 두가지 protocol로 운영됩니다

    그 둘은 NetBEUI와 TCP/IP 입니다

    말씀하신 컴퓨터의 alive 검사는 물론 두가지 방법으로 검사할 수 있습니다

    TCP/IP는 ICMP protocol을 사용하는 PING 으로..

    NetBEUI는 WNet 으로 시작하는 API함수를 사용합니다

    그런데 BetBEUI는 디렉토리 서비스를 이용한 alive 검사 이므로

    속도면에서는 TCP/IP보다는 느릴 수 있습니다

    제 생각에는 아직까지는 TCP/IP환경의 네트워크에서 PING을

    이용하시는것이 효율적일것 같습니다

    그리고 PING의 원리가 packet을 해당 컴퓨터에 보내어

    다시 되돌아오는 방법을 사용하는데 컴퓨터가 다운된 상태라면

    응답이 올리가 없고 이럴때는 일정한 시간이 경과한후 응답이 없을경우는

    다운된걸로 보기 때문에 속도가 느립니다



    참고로 아래는 NetBEUI를 사용한 방법입니다

    디렉토리 서비스를 사용하기 때문에 다운된 컴퓨터도 응답이 올 수 있습니다



    unit Unit1;



    interface



    uses

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

    StdCtrls;



    type

    TForm1 = class(TForm)

    Edit1: TEdit;

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    function RemoteComputerExists(const ComputerName : String) : Boolean;

    {

    Returns True if the remote computer ComputerName exists on the network.

    ComputerName must be of the form "Name". The function is not case-sensitive.

    Be warned that this may take a *long* time to return.



    Based on code supplied by:

    Michael P. Bobowski

    Atled Engineering Group

    Milwaukee, WI



    }

    function Enumerate(lpnr : PNetResource; const ComputerName : String): Boolean;

    type

    TNetResourceArray = array[0..16383] of TNetResource;

    PNetResourceArray = ^TNetResourceArray;

    var

    hEnum: THandle;

    BufferSize, NumEntries, Entry: Integer;

    lpnrLocalc: PNetResourceArray;

    begin

    Result := False;

    if NO_ERROR <> WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0 {Usage: All resources}, lpnr, hEnum) then

    begin

    Exit;

    end;

    BufferSize := 16384; {16 kB}

    {Get as many entries as possible; NumEntries will be set to the number actually read (if successfull)}

    NumEntries := $FFFFFFFF;

    lpnrLocalc := AllocMem(BufferSize);

    repeat

    case WNetEnumResource(hEnum, NumEntries, lpnrLocalc, BufferSize) of

    NO_ERROR : begin

    for Entry := 0 to (NumEntries - 1) do

    begin

    {lpnrLocalc^[Entry].dwScope will be RESOURCE_GLOBALNET since that is what we asked for}

    if 0 = ANSICompareText(lpnrLocalc^[Entry].lpRemoteName,ComputerName) then

    begin

    {lpnrLocalc^[Entry].dwDisplayType = RESOURCEDISPLAYTYPE_SERVER should also be True}

    {RESOURCEUSAGE_CONTAINER = (lpnrLocalc^[Entry].dwUsage and RESOURCEUSAGE_CONTAINER) should also be True}

    Result := True;

    break;

    end; {then}

    {ResourceType is irrelevant}



    if (lpnrLocalc^[Entry].dwDisplayType = RESOURCEDISPLAYTYPE_DOMAIN) or

    (lpnrLocalc^[Entry].dwDisplayType = RESOURCEDISPLAYTYPE_NETWORK) then

    begin

    {Must recurse}

    if RESOURCEUSAGE_CONTAINER = (lpnrLocalc^[Entry].dwUsage and RESOURCEUSAGE_CONTAINER) then

    begin

    {Recursion possible}

    Result := Enumerate(@(lpnrLocalc^[Entry]), ComputerName);

    if Result then

    break;

    end; {then}

    end; {then}

    end; {for}

    end; {NO_ERROR}



    ERROR_MORE_DATA : begin

    {The buffer is too small for even one entry: increase the buffer...}

    FreeMem(lpnrLocalc, BufferSize);

    BufferSize := 2*BufferSize;

    lpnrLocalc := AllocMem(BufferSize);

    {...and try again}

    end; {ERROR_MORE_DATA}

    else

    {

    ERROR_NO_MORE_ITEMS (Enumeration is complete)

    ERROR_INVALID_HANDLE (The handle given by the hEnum parameter is not valid)

    ERROR_NO_NETWORK (No network is present)

    ERROR_EXTENDED_ERROR (use WNetGetLastError for details)

    }

    break;

    end; {case}

    until Result;



    FreeMem(lpnrLocalc, BufferSize);

    WNetCloseEnum(hEnum);

    end; {Enumerate}



    begin

    {Start enumeration at the root of the network}

    Result := Enumerate(Nil, ComputerName);

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    // Edit.Text에 컴퓨터 이름을 사용자가 입력함

    if Pos('', Edit1.Text) = 0 then

    Edit1.Text := ''+Edit1.Text;



    if RemoteComputerExists(Edit1.Text) then

    ShowMessage('네트워크 컴퓨터가 존재합니다 ')

    else

    ShowMessage('네트워크 컴퓨터가 존재하지 않습니다 ');

    end;



    end.





  • Profile
    바보 2000.01.29 08:35
    방법이 하나 더 있습니다.



    심장이 뛰는지 들어보면 되구요. 아니면 맥박을 확인하든지...

  • Profile
    구창민 1999.09.15 18:43
    이광주 wrote:

    > 컴퓨터가 네트워크에 참여하고 있는지 알고 싶어요... 간단한 방법 없을까요?

    > ping을 사용하여 봤지만....

    > 죽어있을 경우에는 확인하는데 시간이 너무 걸리더라구요....

    > 제 경우에는 ip체크만 합니다....

    > 부탁드릴께요... 그럼 수고하십시오~~



    이광주님 안녕하세요?

    ICS컴포넌트를 사용해 보셨나요?

    사용해 보시지 않았다면 권장드립니다.

    훌륭한 컴포넌트입니다.

    예제도 친절히 작성되어 있구요.

    Ping테스트예제도 있었던거 같네요.

    원하시는 기능을 구현하실수 있지 않을까 생각됩니다.

    그럼.. 즐거운 프로그래밍 되시구요.





    PS: ICS컴포넌트는 델파이 슈퍼페이지나

    국내 사이트에서도 찾으실수 있을 겁니다.