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

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


Category

  김영대(2003-03-07 22:16:49, Hit : 5928, Vote : 1309
 모든 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.





331   [데이터베이스] dBase 테이블의 삭제된 레코드 보기  김영대 2003/03/07 4363 1164
330   [일반/컴포넌트] TEdit 입력이 최대 길이를 벋어나면 focus 이동  김영대 2003/03/07 4717 1221
329   [윈도우즈 API] 윈도우즈에 프로그램으로 폰트 등록하기  김영대 2003/03/07 5794 1550
328   [네트웍/인터넷] NT 네트워크 환경의 컴퓨터 리스트 구하기  김영대 2003/03/07 7302 1811
327   [일반/컴포넌트] 모든 드라이브,디렉토리 검색하여 파일 찾기  김영대 2003/03/07 5036 1232
326   [일반/컴포넌트] Bitmap(BMP) 크기를 변경(Stretch)하여 저장하기  김영대 2003/03/07 5196 1366
325   [데이터베이스] Query.RecordCount = -1  김영대 2003/03/07 5399 1245
324   [일반/컴포넌트] 수직 스크롤이 맨마지막으로 이동했는지 검사  김영대 2003/03/07 4134 1213
323   [데이터베이스] 몇가지 BDE 환경정보 구하기  김영대 2003/03/07 4659 1219
322   [일반/컴포넌트] StringGrid의 중간에 제목 Cell 두기  김영대 2003/03/07 5714 1435
321   [일반/컴포넌트] ListBox, ComboBox에 근접검색 하기  김영대 2003/03/07 5929 1705
320   [일반/컴포넌트] 커서(캐럿)가 line 위에 있는지 검사하기  김영대 2003/03/07 4335 1136
319   [시스템] Shutdown/Reboot/Logoff Windows 9x/NT/Me/2000 ?  김영대 2003/03/07 5514 1427
318   [시스템] ROM-BIOS 정보 읽기  김영대 2003/03/07 5696 1334
317   [시스템] process 가 사용한 메모리 구하기  김영대 2003/03/07 5036 1298
316   [시스템] CPU 이름 구하기  김영대 2003/03/07 5583 1404
315   [시스템] IP address 바꾸기  김영대 2003/03/07 5948 1429
314   [일반/컴포넌트] IE(Internet Explorer) toolbar 에 버튼 올리기  김영대 2003/03/07 4497 1167
313   [시스템] WndProc for TComonent  김영대 2003/03/07 5103 1371
312   [시스템] Hooking methods (Application.OnMessage)  김영대 2003/03/07 8029 1581
311   [일반/컴포넌트] RichEdit 에 tab 설정하기  김영대 2003/03/07 4579 1197
310   [일반/컴포넌트] TStringGrid 인쇄하기  김영대 2003/03/07 5841 1444
309   [일반/컴포넌트] StringGrid - multiline text  김영대 2003/03/07 6270 1437
308   [일반/컴포넌트] System Menu 의 닫기 메뉴 disable 시키기  김영대 2003/03/07 4007 1043
307   [일반/컴포넌트] 메인메뉴가 팝업될때 이벤트를 탈수있는방법  김영대 2003/03/07 6808 1756
306   [데이터베이스] how to get records from Oracle StoredProcedure  김영대 2003/03/07 4721 1291
305   [윈도우즈 API] Task bar 에 나타나지 않는 프로그램 만들기  김영대 2003/03/07 6162 1567
304   [일반/컴포넌트] Convert UNIX, TDateTime  김영대 2003/03/07 6502 1706
303   [윈도우즈 API] IE 의 즐겨찾기 읽기  김영대 2003/03/07 6005 1550
302   [네트웍/인터넷] HTTP로 파일 다운받기2 (WinInet 이용)  김영대 2003/03/07 7157 1781
301   [시스템] 윈도우즈 공유폴더 리스트 얻기  김영대 2003/03/07 5918 1405
300   [일반/컴포넌트] TStringGrid 인쇄하기  김영대 2003/03/07 5014 1212
299   [네트웍/인터넷] HTTP로 파일 다운받기 (WinInet 이용)  김영대 2003/03/07 6851 1803
298   [시스템] mutex를 이용한 중복 실행 방지  김영대 2003/03/07 19102 1574
297   [시스템] Windows 9x/ME/NT/2000/XP 버전 구별  김영대 2003/03/07 4930 1306
296   [네트웍/인터넷] HTTP 프로토콜을 이용하여 파일 다운받기  김영대 2003/03/07 6538 1677
295   [일반/컴포넌트] Outlook Express 설치여부 알아내기  김영대 2003/03/07 5135 1167
  [네트웍/인터넷] 모든 TCP/IP interfaces 의 IP/Netmask 구하기  김영대 2003/03/07 5928 1309
293   [네트웍/인터넷] Sending Raw IP Packets  김영대 2003/03/07 6998 1814
292   [윈도우즈 API] 마우스 위치의 콘트롤(콤포넌트)을 조사하기  김영대 2003/03/07 4944 1173

[이전 10개] [1]..[11][12][13][14][15][16] 17 [18][19][20]..[25] [다음 10개]
 

Copyright 1999-2024 Zeroboard / skin by zero