列舉出所有的TCP/IP連接 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
列舉出所有的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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |