線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2444
推到 Plurk!
推到 Facebook!

列舉出所有的TCP/IP連接

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-16 18:42:04 IP:61.218.xxx.xxx 未訂閱

列舉出所有的TCP/IP連接

資料來源年代久遠不可考,作者不詳!
unit USock;    interface    uses Windows, Winsock;    {
 此函數列舉出所有的TCP/IP連接,並返回一個由回車換行(CRLF)符分隔的字符串,包含以下信息:
 IP, NetMask, BroadCast-Address, Up/Down status,
 Broadcast support, Loopback
 如果你將這個字符串賦給TMemo(它的Memo.Lines.Text屬性),你可以看到更清晰的結果。
 使用此函數,你需要Win98/ME/2K, 95 OSR 2 或者NT service pack #3,因為程序會使用到WinSock 2(WS2_32.DLL)。
}
function EnumInterfaces(var sInt: string): Boolean;    { 從Winsock 2.0導入函數WSAIOCtl -- 在Win98/ME/2K and 95 OSR2, NT srv pack #3下才有Winsock 2 }
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. 打開Winsock
 2. 創建一個socket
 3. 調用WSAIOCtl獲取網絡連接
 4. 對每個連接,獲取它的IP、掩碼、廣播地址、狀態
 5. 將信息填充到一個由CDLF分隔的字符串中
 6. 結束
--------------------------------------------------------------------}    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.    
聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
LCY0803
一般會員


發表:0
回覆:1
積分:0
註冊:2005-08-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-07 10:30:35 IP:210.63.xxx.xxx 未訂閱
//我目前使用 Delphi 7 //直接引用 IdWinSock2 也可以達到取出本機 IP, Subnet Mask, Gateway,... uses ..., IdWinSock2 implementation {$R *.dfm} //Strat WinSock WSAStartUP($0202, wsaD); //其他呼叫函式 "Socket","WSAIoCtl" 如同 axsoft 所提文章不在贅述。
系統時間:2024-05-02 6:17:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!