当然可以乐!
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; 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'; 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.
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; 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'; 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.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货