?? usock.pas
字號:
unit uSock;
interface
uses Windows, Winsock;
{
使用到WinSock2。
這是一個完整的Delphi單元,將它加入到你的工程中,你可以調用:
EnumInterfaces(var s string): Boolean;
來返回所有IP地址、網絡掩碼、廣播地址和連接狀態(tài)。
此函數列舉出所有的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 : 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;
type
IP_INFO = record
sIP : string;
sMask : string;
sBroadcast : string;
sInterface : string;
sSupported : string;
sLoopback : string;
end;
var
g_IPInfo : array of IP_INFO;
implementation
(***************************************************
功能:得到本機的IP、掩碼、廣播地址、狀態(tài)等信息
設計:
1. 打開Winsock
2. 創(chuàng)建一個socket
3. 調用WSAIOCtl獲取網絡連接
4. 對每個連接,獲取它的IP、掩碼、廣播地址、狀態(tài)
5. 將信息填充到g_IPInfo記錄數組中
6. 結束
返回值:true 成功;false失敗
****************************************************)
function EnumInterfaces : 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 := false; // Initialize
WSAStartup($0101, wsaD); // Start WinSock
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
NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);
setlength(g_IPInfo,NumInterfaces);
for i := 0 to NumInterfaces - 1 do // For every interface
begin
pAddrInet := Buffer[i].iiAddress.addressIn; // IP ADDRESS
pAddrString := inet_ntoa(pAddrInet.sin_addr);
g_IPInfo[i].sIP := pAddrString;
pAddrInet := Buffer[i].iiNetMask.addressIn; // SUBNET MASK
pAddrString := inet_ntoa(pAddrInet.sin_addr);
g_IPInfo[i].sMask := pAddrString;
pAddrInet := Buffer[i].iiBroadCastAddress.addressIn; // Broadcast addr
pAddrString := inet_ntoa(pAddrInet.sin_addr);
g_IPInfo[i].sBroadcast := pAddrString;
SetFlags := Buffer[i].iiFlags;
if (SetFlags and IFF_UP) = IFF_UP then
g_IPInfo[i].sInterface := 'Interface UP' // Interface up/down
else
g_IPInfo[i].sInterface := 'Interface DOWN';
if (SetFlags and IFF_BROADCAST) = IFF_BROADCAST then // Broadcasts
g_IPInfo[i].sSupported := 'Broadcasts supported' // supported or
else // not supported
g_IPInfo[i].sSupported := 'Broadcasts NOT supported';
if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then // Loopback or
g_IPInfo[i].sLoopback := 'Loopback interface'
else
g_IPInfo[i].sLoopback := 'Network interface'; // normal
end;
end;
except
end;
CloseSocket(s);
WSACleanUp;
result := true;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -