unit ips;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, winsock;
type
function WSAIoctl( hSocket: TSocket; ControlCode:dword;
InBuf : Pointer; InBufLen:DWord;
OutBuf : Pointer; OutBufLen:DWord;
BytesReturned : PDWord;
lpOverlapped: POverlapped;
lpOverlappedRoutine:pointer) : Integer; stdcall;
function WSASocket(Family, sType, Protocol : Integer;
lpProtocolInfo : Pointer;
Group : uint;
dwFlags : DWORD): TSocket; stdcall;
function WSAIoctl; external 'ws2_32.dll' name 'WSAIoctl';
function WSASocket; external 'ws2_32.dll' name 'WSASocketA';
function GetAvailIp:TStrings;
function GetCardBindingIp : TStrings;
function GetConnectionIp : string;
implementation
{$R *.dfm}
function GetAvailIp:TStrings;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: array [0..63] of char;
i: Integer;
GInitData: TWSADATA;
begin
result := TStringList.Create;
WSAStartup($101, GInitData);
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
i := 0;
while pptr^[i] <> nil do
begin
result.add(StrPas(inet_ntoa(pptr^[i]^)));
Inc(i);
end;
WSACleanup;
end;
Function getCardBindingIp : TStrings;
const
SIO_GET_INTERFACE_LIST : dword = 1074033791;
type
_INTERFACE_INFO = record
iiFlags : ulong; //* Type and status of the interface */
iiAddress : TSockaddr; //* Interface address */
iiBroadcastAddress : TSockaddr; //* Broadcast address */
iiNetmask : TSockaddr; //* Network mask */
end;
var
pAddrInet : TSockAddr;
OutBufLen,
RecvBytes,
i : DWORD;
Buffer: array [0..63] of char;
wsError : Integer;
WSAData : TWSAData;
MySocket : TSocket;
localAddr : Array[1..10] of _INTERFACE_INFO; //up to 10 NICs
begin
result := TStringList.Create;
wsError := Winsock.WSAStartup(2, WSAData);
If wsError <> 0 then exit;
Gethostname(Buffer, 64);
MySocket := WSASocket(AF_INET, Sock_DGRAM, IPPROTO_UDP, nil,0,0);
If MySocket = INVALID_SOCKET then exit;
OutBufLen := Sizeof(localAddr);
RecvBytes := OutBufLen;
FillChar(LocalAddr,OutBufLen,0);
wsError := WSAIoctl(MySocket,SIO_GET_INTERFACE_LIST,nil,0,@localAddr,OutBufLen,@RecvBytes,nil,nil);
if wsError = SOCKET_ERROR then
begin
wsError := WSAGetLastError;
Raise Exception('Socket error:'+IntToStr(wsError));
exit;
end;
for i := 1 to RecvBytes div Sizeof(_Interface_Info) do
begin
pAddrInet := localAddr[i].iiAddress;
result.add(inet_ntoa(pAddrInet.sin_addr));
end;
closesocket(MySocket);
WSACleanup();
end;
function GetConnectionIp : string;
var
avail,binding : TStrings;
i ,j : integer;
begin
result := '';
avail := getAvailIp;
binding := getCardBindingIp;
for i := 0 to avail.Count - 1 do
begin
for j := 0 to binding.Count - 1 do
begin
if avail[i] = binding[j] then
begin
result := avail[i];
exit;
end;
end;
end;
end;