如何获得本地的公网Ip地址 如何获得本地的公网Ip地址 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是拨号上网的,请用:unit GetIpCon;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;const RAS_MaxDeviceType = 16; //设备类型名称长度 RAS_MaxEntryName = 256; //连接名称最大长度 RAS_MaxDeviceName = 128; //设备名称最大长度 RAS_MaxIpAddress = 15; //IP地址的最大长度 RASP_PppIp = $8021; //拨号连接的协议类型,该数值表示PPP连接type HRASCONN = DWORD; //拨号连接句柄的类型 RASCONN = record //活动的拨号连接的句柄和设置信息 dwSize : DWORD; //该结构所占内存的大小(Bytes),一般设置为SizeOf(RASCONN) hrasconn : HRASCONN; //活动连接的句柄 szEntryName : array[0..RAS_MaxEntryName] of char; //活动连接的名称 szDeviceType : array[0..RAS_MaxDeviceType] of char; //活动连接的所用的设备类型 szDeviceName : array[0..RAS_MaxDeviceName] of char; //活动连接的所用的设备名称 end; TRASPPPIP = record //活动的拨号连接的动态IP地址信息 dwSize : DWORD; //该结构所占内存的大小(Bytes),一般设置为SizeOf(TRASPPPIP) dwError : DWORD; //错误类型标识符 szIpAddress : array[ 0..RAS_MaxIpAddress ] of char; //活动的拨号连接的IP地址 end;//获取所有活动的拨号连接的信息(连接句柄和设置信息)Function GetRasIP(RasIndex:integer):String;function RasEnumConnections( var lprasconn : RASCONN ; //接收活动连接的缓冲区的指针 var lpcb : DWORD; //缓冲区大小 var lpcConnections : DWORD //实际的活动连接数 ) : DWORD; stdcall;function RasEnumConnections ; external 'Rasapi32.dll' name 'RasEnumConnectionsA';//获取指定活动的拨号连接的动态IP信息function RasGetProjectionInfo( hrasconn : HRasConn; //指定活动连接的句柄 rasprojection : DWORD; //RAS连接类型 var lpprojection : TRASPPPIP; //接收动态IP信息的缓冲区 var lpcb : DWord //接收缓冲区的大小 ) : DWORD;stdcall;function RasGetProjectionInfo ; external 'Rasapi32.dll' name 'RasGetProjectionInfoA';implementationFunction GetRasIP(RasIndex:integer):String;var connections : array[0..9] of RASCONN ; //拨号连接数组 longSize : dword; intAvailabelConnections : dword; //活动的拨号连接的实际数目 intIndex : integer; dwResult : DWORD; dwSize : DWORD; RASpppIP : TRASPPPIP ; //活动的拨号连接的动态IP地址信息begin connections[ 0 ].dwSize := sizeof(RASCONN); longSize := 10 * connections[ 0 ].dwSize ; //接收活动连接的缓冲区大小 intAvailabelConnections := 0 ; //获取所有活动的拨号连接的信息(连接句柄和设置信息) dwResult := RasEnumConnections( connections[ 0 ], longSize,intAvailabelConnections ); Result := ''; if 0 <> dwResult then Result := 'Error' else begin for intIndex := 0 to intAvailabelConnections - 1 do begin dwSize := SizeOf(RASpppIP); RASpppIP.dwSize := dwSize; dwResult := RASGetProjectionInfo(connections[intIndex].hRasConn,RASP_PppIp,RasPPPIP,dwSize);//获取动态IP地址 if 0 <> dwResult then Result := 'Error' else Result := StrPas(RASpppIP.szIPAddress); end; end; end;end.循环一下就知道了。如果是网卡的,就用另外一个了。 通过交换机连接联通的代理服务器上internet 这个函数可以得到本地IP。uses WinSock, SysUtils;function GetLocalIpAddress : string;type pu_long = ^u_long;var varTWSAData : TWSAData; varPHostEnt : PHostEnt; varTInAddr : TInAddr; namebuf : Array[0..255] of char; fd : integer; rc : integer;begin result := ''; rc := WSAStartup($101,varTWSAData); if rc <> 0 then raise ESockUtilErr.CreateFmt( 'WSA Startup error: %d',[rc] ) else begin gethostname(namebuf,sizeof(namebuf)); varPHostEnt := gethostbyname(namebuf); varTInAddr.S_addr := u_long(pu_long(varPHostEnt^.h_addr_list^)^); result := inet_ntoa(varTInAddr); end; fd := WinSock.Socket( PF_INET, SOCK_STREAM, 0 ); if fd = INVALID_SOCKET then raise ESockUtilErr.CreateFmt( '%d %d: Invalid socket',[fd,WSAGetLastError] ); WSACleanup;end; delphi不是有IP的组件吗。用得着写代码吗? 是啊,联通的代理服务器IP地址不固定,但怎么象QQ那样得到呢 jjp(jjp)在你的碟子里,我不是已经给了答案了吗?? 加急问题...搞了我很久了..高手进来看下 RvDataSetConnection1和RvProject1做随查询结果更新的报表 edit 实现一点功能 如何获取字符串中字符的ASCII值 远程控制 ADO连接EXCEL SQL Server数据库里某表的一字段存放的是varbinary数据,如何取到一byte数组里面? Delphi7.0中怎样制作XP样式的下拉菜单(急!在线等) 对Web Service感兴趣的兄弟请进来!是个小问题 用SQL语句创建ACCESS表???!!! 关于日期的计算问题。 delphi的哪个版本好用啊,中文版好用吗?
unit GetIpCon;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
const
RAS_MaxDeviceType = 16; //设备类型名称长度
RAS_MaxEntryName = 256; //连接名称最大长度
RAS_MaxDeviceName = 128; //设备名称最大长度
RAS_MaxIpAddress = 15; //IP地址的最大长度
RASP_PppIp = $8021; //拨号连接的协议类型,该数值表示PPP连接
type
HRASCONN = DWORD; //拨号连接句柄的类型
RASCONN = record //活动的拨号连接的句柄和设置信息
dwSize : DWORD; //该结构所占内存的大小(Bytes),一般设置为SizeOf(RASCONN)
hrasconn : HRASCONN; //活动连接的句柄
szEntryName : array[0..RAS_MaxEntryName] of char; //活动连接的名称
szDeviceType : array[0..RAS_MaxDeviceType] of char; //活动连接的所用的设备类型
szDeviceName : array[0..RAS_MaxDeviceName] of char; //活动连接的所用的设备名称
end; TRASPPPIP = record //活动的拨号连接的动态IP地址信息
dwSize : DWORD; //该结构所占内存的大小(Bytes),一般设置为SizeOf(TRASPPPIP)
dwError : DWORD; //错误类型标识符
szIpAddress : array[ 0..RAS_MaxIpAddress ] of char; //活动的拨号连接的IP地址
end;
//获取所有活动的拨号连接的信息(连接句柄和设置信息)
Function GetRasIP(RasIndex:integer):String;
function RasEnumConnections(
var lprasconn : RASCONN ; //接收活动连接的缓冲区的指针
var lpcb : DWORD; //缓冲区大小
var lpcConnections : DWORD //实际的活动连接数
) : DWORD; stdcall;function RasEnumConnections ; external 'Rasapi32.dll' name 'RasEnumConnectionsA';//获取指定活动的拨号连接的动态IP信息
function RasGetProjectionInfo(
hrasconn : HRasConn; //指定活动连接的句柄
rasprojection : DWORD; //RAS连接类型
var lpprojection : TRASPPPIP; //接收动态IP信息的缓冲区
var lpcb : DWord //接收缓冲区的大小
) : DWORD;stdcall;
function RasGetProjectionInfo ; external 'Rasapi32.dll' name 'RasGetProjectionInfoA';implementation
Function GetRasIP(RasIndex:integer):String;var
connections : array[0..9] of RASCONN ; //拨号连接数组
longSize : dword;
intAvailabelConnections : dword; //活动的拨号连接的实际数目
intIndex : integer;
dwResult : DWORD;
dwSize : DWORD;
RASpppIP : TRASPPPIP ; //活动的拨号连接的动态IP地址信息
begin
connections[ 0 ].dwSize := sizeof(RASCONN);
longSize := 10 * connections[ 0 ].dwSize ; //接收活动连接的缓冲区大小
intAvailabelConnections := 0 ; //获取所有活动的拨号连接的信息(连接句柄和设置信息)
dwResult := RasEnumConnections( connections[ 0 ], longSize,intAvailabelConnections );
Result := '';
if 0 <> dwResult then
Result := 'Error'
else begin
for intIndex := 0 to intAvailabelConnections - 1 do begin
dwSize := SizeOf(RASpppIP);
RASpppIP.dwSize := dwSize;
dwResult := RASGetProjectionInfo(connections[intIndex].hRasConn,RASP_PppIp,RasPPPIP,dwSize);//获取动态IP地址
if 0 <> dwResult then
Result := 'Error'
else
Result := StrPas(RASpppIP.szIPAddress);
end;
end;
end;
end.循环一下就知道了。如果是网卡的,就用另外一个了。
uses
WinSock, SysUtils;function GetLocalIpAddress : string;
type
pu_long = ^u_long;
var
varTWSAData : TWSAData;
varPHostEnt : PHostEnt;
varTInAddr : TInAddr;
namebuf : Array[0..255] of char;
fd : integer;
rc : integer;
begin
result := '';
rc := WSAStartup($101,varTWSAData);
if rc <> 0 then
raise ESockUtilErr.CreateFmt( 'WSA Startup error: %d',[rc] )
else
begin
gethostname(namebuf,sizeof(namebuf));
varPHostEnt := gethostbyname(namebuf);
varTInAddr.S_addr := u_long(pu_long(varPHostEnt^.h_addr_list^)^);
result := inet_ntoa(varTInAddr);
end;
fd := WinSock.Socket( PF_INET, SOCK_STREAM, 0 );
if fd = INVALID_SOCKET then
raise ESockUtilErr.CreateFmt( '%d %d: Invalid socket',[fd,WSAGetLastError] );
WSACleanup;
end;