::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-07 22:16:49, Hit : 5711, Vote : 1257
 모든 TCP/IP interfaces 의 IP/Netmask 구하기

This is a complete Delphi unit. By adding it to a project you can
call :

   EnumInterfaces(var s string): Boolean;

that returns a CRLF separated string of all IP addresses, netmasks,
broadcast addresses and interface status.

--------------------------------------------------------------------

unit USock;

interface

uses Windows, Winsock;

{

  This function enumerates all TCP/IP interfaces and
  returns a CRLF separated string containing:

  IP, NetMask, BroadCast-Address, Up/Down status,
  Broadcast support, Loopback

  If you feed this string to a wide TMEMO (to its memo.lines.text
  property) you will see cleary the results.

  To use this you need Win98/ME/2K, 95 OSR 2 or NT service
  pack #3 because WinSock 2 is used (WS2_32.DLL)

}

function EnumInterfaces(var sInt: string): Boolean;

{ Imported function WSAIOCtl from Winsock 2.0 - Winsock 2 is }
{ available only in Win98/ME/2K and 95 OSR2, NT srv pack #3 }

function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen:
  DWORD;
  lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
  lpdwOutBytesReturned: LPDWORD;
  lpOverLapped: POINTER;
  lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL';

{ Constants taken from C header files }

const SIO_GET_INTERFACE_LIST = $4004747F;
  IFF_UP = $00000001;
  IFF_BROADCAST = $00000002;
  IFF_LOOPBACK = $00000004;
  IFF_POINTTOPOINT = $00000008;
  IFF_MULTICAST = $00000010;

type sockaddr_gen = packed record
    AddressIn: sockaddr_in;
    filler: packed array[0..7] of char;
  end;

type INTERFACE_INFO = packed record
    iiFlags: u_long; // Interface flags
    iiAddress: sockaddr_gen; // Interface address
    iiBroadcastAddress: sockaddr_gen; // Broadcast address
    iiNetmask: sockaddr_gen; // Network mask
  end;

implementation

{-------------------------------------------------------------------

1. Open WINSOCK
2. Create a socket
3. Call WSAIOCtl to obtain network interfaces
4. For every interface, get IP, MASK, BROADCAST, status
5. Fill a CRLF separated string with this info
6. Finito

--------------------------------------------------------------------}

function EnumInterfaces(var sInt: string): Boolean;
var s: TSocket;
  wsaD: WSADATA;
  NumInterfaces: Integer;
  BytesReturned, SetFlags: u_long;
  pAddrInet: SOCKADDR_IN;
  pAddrString: PCHAR;
  PtrA: pointer;
  Buffer: array[0..20] of INTERFACE_INFO;
  i: Integer;
begin
  result := true;                               // Initialize
  sInt := '';

  WSAStartup($0101, wsaD);                      // Start WinSock
                                                // You should normally check
                                                // for errors here :)

  s := Socket(AF_INET, SOCK_STREAM, 0);         // Open a socket
  if (s = INVALID_SOCKET) then exit;

  try                                           // Call WSAIoCtl
    PtrA := @bytesReturned;
    if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil,
      nil)
      <> SOCKET_ERROR)
      then
    begin                                       // If ok, find out how
                                                // many interfaces exist

      NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);

      for i := 0 to NumInterfaces - 1 do        // For every interface
      begin
        pAddrInet := Buffer[i].iiAddress.addressIn;           // IP ADDRESS
        pAddrString := inet_ntoa(pAddrInet.sin_addr);
        sInt := sInt + ' IP=' + pAddrString + ',';
        pAddrInet := Buffer[i].iiNetMask.addressIn;           // SUBNET MASK
        pAddrString := inet_ntoa(pAddrInet.sin_addr);
        sInt := sInt + ' Mask=' + pAddrString + ',';
        pAddrInet := Buffer[i].iiBroadCastAddress.addressIn;  // Broadcast addr
        pAddrString := inet_ntoa(pAddrInet.sin_addr);
        sInt := sInt + ' Broadcast=' +  pAddrString + ',';

        SetFlags := Buffer[i].iiFlags;
        if (SetFlags and IFF_UP) = IFF_UP then
          sInt := sInt + ' Interface UP,'                   // Interface up/down
        else
          sInt := sInt + ' Interface DOWN,';

        if (SetFlags and IFF_BROADCAST) = IFF_BROADCAST then  // Broadcasts
          sInt := sInt + ' Broadcasts supported,'              // supported or
        else                                                  // not supported
          sInt := sInt + ' Broadcasts NOT supported,';

        if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then    // Loopback or
          sInt := sInt + ' Loopback interface'
        else
          sInt := sInt + ' Network interface';                 // normal

        sInt := sInt + #13#10;                                // CRLF between
                                                              // each interface
      end;
    end;
  except
  end;
//
// Close sockets
//
  CloseSocket(s);
  WSACleanUp;
  result := false;
end;

end.





611   [일반/컴포넌트] 모서리가 둥근(rounded ends) TMemo 만들기  김영대 2004/07/25 4628 1191
610   [윈도우즈 API] 모서리가 둥근(rounded ends) TEdit 만들기  김영대 2003/03/07 4934 1288
609   [윈도우즈 API] 모든 창을 아이콘 표시/취소  김영대 2003/03/07 4319 1236
608   [일반/컴포넌트] 모든 드라이브,디렉토리 검색하여 파일 찾기  김영대 2003/03/07 4792 1189
  [네트웍/인터넷] 모든 TCP/IP interfaces 의 IP/Netmask 구하기  김영대 2003/03/07 5711 1257
606   [데이터베이스] 몇가지 BDE 환경정보 구하기  김영대 2003/03/07 4448 1175
605   [일반/컴포넌트] 명령행 인자(command line argument) 사용하기  김영대 2003/03/05 4970 1332
604   [일반/컴포넌트] 명령행 인자 받아오기  김영대 2003/03/05 7285 1885
603   [일반/컴포넌트] 메인메뉴가 팝업될때 이벤트를 탈수있는방법  김영대 2003/03/07 6600 1724
602   [시스템] 메모리 부하(load)량 측정해 보기  김영대 2003/03/05 5331 1273
601   [윈도우즈 API] 메모(TMemo)의 커서(캐럿)모양 바꾸기  김영대 2003/03/05 5025 1925
600   [일반/컴포넌트] 메뉴의 잘못된 accelerator 를 선택했을때  김영대 2003/03/05 6428 1829
599   [일반/컴포넌트] 메뉴 아이템의 동적 추가와 그림넣기  김영대 2003/03/04 7969 1270
598   [시스템] 마이크 볼륨 조절하기  김영대 2003/03/06 4666 1288
597   [일반/컴포넌트] 마우스커서를 특정위치로 이동시키기  김영대 2003/03/05 5921 1214
596   [시스템] 마우스의 좌/우 기능설정과 버튼갯수 알기  김영대 2003/03/06 7493 2033
595   [시스템] 마우스의 좌,우 버튼의 동작 바꾸기  김영대 2003/03/07 4290 1204
594   [윈도우즈 API] 마우스의 이동범위 제한하기  김영대 2003/03/05 6032 1494
593   [윈도우즈 API] 마우스의 모양 바꾸고 이동범위 제한하기  김영대 2003/03/05 5132 1267
592   [일반/컴포넌트] 마우스영역 제어하기  김영대 2003/03/05 3697 984
591   [일반/컴포넌트] 마우스를 특정 콤포넌트 위로 위치시키기  김영대 2003/03/05 4351 1113
590   [일반/컴포넌트] 마우스로 ProgressBar의 Position 바꾸기  김영대 2006/02/28 5325 1372
589   [일반/컴포넌트] 마우스가 폼위에 있는지 여부를 알아내려면...  김영대 2003/03/05 5294 1447
588   [시스템] 마우스가 설치되어 있는지 검사하기  김영대 2003/03/07 6893 1848
587   [시스템] 마우스 포인터 속도 바꾸기  김영대 2003/03/06 5060 1259
586   [시스템] 마우스 포인터 속도 구하기  김영대 2003/03/06 5583 1720
585   [일반/컴포넌트] 마우스 커서 보이기/감추기  김영대 2003/03/05 6315 1698
584   [시스템] 마우스 자취(trails)의 갯수 조정하기  김영대 2003/03/06 5957 1844
583   [윈도우즈 API] 마우스 위치의 콘트롤(콤포넌트)을 조사하기  김영대 2003/03/07 4642 1121
582   [윈도우즈 API] 마우스 위치(Desktop)의 색상값 구하기  김영대 2003/03/05 6304 1590
581   [시스템] 마우스 아래의 윈도우 핸들 구하기  김영대 2004/07/24 9451 1984
580   [시스템] 마우스 두 번 누르기 속도 조정하기  김영대 2003/03/06 6026 1832
579   [일반/컴포넌트] 리스트뷰에서 동적으로 칼럼삭제하기  김영대 2003/03/05 5370 1412
578   [일반/컴포넌트] 루틴의 처리시간(경과시간) 구하기  김영대 2003/03/05 4279 1110
577   [시스템] 로컬 가상 드라이버(substitution device) 만들고 제거하기  김영대 2004/07/25 6143 1335
576   [일반/컴포넌트] 레코드 구조를 배열요소로 갖는 정적인 배열  김영대 2003/03/05 4075 1099
575   [윈도우즈 API] 레지스트리의 특정키를 파일로 저장/복원하기  김영대 2003/03/07 6600 1490
574   [윈도우즈 API] 레지스트리의 변경여부 알리는 2가지 방법  김영대 2003/03/06 4775 1284
573   [일반/컴포넌트] 레지스트리의 기본 RootKey 바꾸기  김영대 2003/03/05 4222 1277
572   [일반/컴포넌트] 레지스트리의 "(기본값)" 에 읽고/쓰기  김영대 2003/03/07 3999 1132

[1][2][3][4][5][6][7][8][9] 10 ..[25] [다음 10개]
 

Copyright 1999-2022 Zeroboard / skin by zero