RasAPI函数实现PPPOE拨号
unit uDial; interface
uses
Windows,Messages, SysUtils, Ras;// Classes; var
//EntryName,UserName,PassWord:string; nRasConnCount: DWORD;
aRasConn:array [0..10] of TRASCONN;
hRasConn:THRASCONN;
IsConnected:boolean;
RasDialConEnd:boolean;
RasError:string; function Dial(FEntryName, FUserName, FPassword : String):integer;
procedure Disconnected;
function GetIP:string;
implementation procedure Disconnected;//断开连接 begin
try
if hRasConn <> 0 then
begin
RasHangUp(hRasConn);
hRasConn:= 0;
end;
except
end;
end; function GetActiveConn:string; //读取活动连接 var
dwRet : DWORD;
nCB : DWORD;
Buf : array [0..255] of Char;
begin
try
aRasConn[0].dwSize := SizeOf(aRasConn[0]);
nCB := SizeOf(aRasConn);
dwRet := RasEnumConnections(@aRasConn, @nCB, @nRasConnCount);//枚举活动连接 if dwRet <> 0 then begin
RasGetErrorString(dwRet, @Buf[0], SizeOf(Buf));
result:=Buf;
end
else result:='';
except
end;
end; function GetActiveConnHandle(szName : String) : THRASCONN; //读取活动连接的句柄 var
I : Integer;
begin
GetActiveConn;
if nRasConnCount > 0 then begin
for I := 0 to nRasConnCount - 1 do begin
if StrIComp(PChar(szName), aRasConn[I].szEntryName) = 0 then begin
Result := aRasConn[I].hRasConn;
Exit;
end;
end;
end;
Result := 0;
end; function CheckConn(FEntryName:string):boolean; //检测是否已经连接 begin
hRasConn := GetActiveConnHandle(FEntryName);
if hRasConn <> 0 then
result:=True
else
Result:=False;
end; function GetIP:string;
begin
result:=RasGetIPAddress;
if result='' then result :='Unknow';
end; //回调函数 procedure RasDialFunc(unMsg : DWORD;FRasConnState : TRASCONNSTATE;FdwError : DWORD); stdcall;
var
Buf: array [0..255] of Char;
ConnState:string;
begin
try
ConnState:=RasConnectionStateToString(FRasConnState); //连接状态 if FRasConnState = RASCS_Connected then
begin //连接成功 IsConnected:=true;
RasDialConEnd:=true;
end
else if FdwError<>0 then //连接出错 begin
RasGetErrorString(FdwError, @Buf[0], SizeOf(Buf));
RasError:=(Buf);
Disconnected;
IsConnected:=false;
RasDialConEnd:=true;
end;
except
end; end; function Dial(FEntryName, FUserName, FPassword : String):integer;//拨号连接 {type TDialThread=class(TThread)
private
public
constructor Create;
procedure Execute; override;
end;
constructor TDialThread.Create;
begin
inherited Create(false); //false 创建后立即执行 FreeOnTerminate:=true; //true 自动结束线程 end; procedure TDialThread.Execute;
begin
while Not RasDialConEnd do
begin
sleep(100);
end;
end;
}
var
rdParams : TRASDIALPARAMS;
dwRet : DWORD;
Buf : array [0..255] of Char;
//thDial : TDialThread; begin
result:=0;
try
hRasConn := GetActiveConnHandle(FEntryName);
if hRasConn <> 0 then //已经在连接中 begin
IsConnected:=true;
RasDialConEnd:=true;
Exit;
end; // setup RAS Dial Parameters FillChar(rdParams, SizeOf(rdParams), 0);
rdParams.dwSize := SizeOf(TRASDIALPARAMS);
strCopy(rdParams.szUserName, PChar(FUserName));
strCopy(rdParams.szPassword, PChar(FPassword));
strCopy(rdParams.szEntryName, PChar(FEntryName));
rdParams.szPhoneNumber[0] := #0;
rdParams.szCallbackNumber[0] := '*';
rdParams.szDomain := '*'; hRasConn := 0;RasDialConEnd:=false;
dwRet := RasDial(nil, nil, @rdParams, 0, @RasDialFunc, @hRasConn);
result:=integer(dwRet);
if dwRet <> 0 then
begin
RasGetErrorString(dwRet, @Buf[0], SizeOf(Buf));
RasError:=(IntToStr(dwRet) + ' ' + Buf);
Disconnected;
end
else;
except
end;
end; function DisconnectActiveConnection: Boolean;//断开活动的连接 const
MaxConnections = 10;//假设最多有10个活动的拨号连接 var
connections : array[0..MaxConnections-1] of TRASCONN;
//拨号连接数组 longSize : dword;
intAvailabelConnections : dword;
//活动的拨号连接的实际数目 intIndex : integer;
strTemp : string;
dwResult : DWORD;
dwSize : DWORD;
RASpppIP : TRASPPPIP;
//活动的拨号连接的动态IP地址信息 begin
connections[ 0 ].dwSize := sizeof(TRASCONN);
longSize := MaxConnections * connections[ 0 ].dwSize;
//接收活动连接的缓冲区大小 intAvailabelConnections := 0;
//获取所有活动的拨号连接的信息(连接句柄和设置信息) dwResult := RasEnumConnections( @connections[ 0 ],@longSize,@intAvailabelConnections );
if 0 = dwResult then
begin
//form1.memo1.lines.add( '现有的活动连接有' +IntToStr( intAvailabelConnections ) + '个'); //显示所有活动的拨号连接的信息(设置信息和动态IP地址) for intIndex := 0 to intAvailabelConnections - 1 do
begin
//显示一个活动的拨号连接的设置信息 //strTemp := '连接名称:'+ StrPAS( connections[ intIndex ].szEntryName )+ ',设备类型:'+ StrPAS( connections[ intIndex ].szDeviceType )+ ',设备名称:'+ StrPAS( connections[ intIndex ].szDeviceName ); //form1.memo1.lines.add( strTemp ); //显示一个活动的拨号连接的动态IP地址 dwSize := SizeOf(RASpppIP);
RASpppIP.dwSize := dwSize;
dwResult := RASGetProjectionInfo( connections[ intIndex ].hRasConn,RASP_PppIp,@RasPPPIP,@dwSize);//获取动态IP地址 {if 0 <> dwResult then
form1.memo1.lines.add('错误:' + inttostr( dwResult ))
else
form1.memo1.lines.add('动态地址:' + StrPas(RASpppIP.szIPAddress));
}
RasHangUp(connections[ intIndex ].hRasConn);
{if RasHangUp(connections[ intIndex ].hRasConn)=0 then
form1.memo1.lines.add('断开连接成功')
else
form1.memo1.lines.add('断开连接失败');
}
end;
end;
end; end.
调用方法
mRet:=Dial('拨号连接的名称','用户名','密码');
RasAPI函数实现PPPOE拨号的更多相关文章
- 破解TP-Link路由-嗅探PPPoE拨号密码
如果你平时都使用路由器直接上网,那么你还记得你的宽带(ADSL)帐户名和密码吗?忘记密码后又该如何找回呢?别急,本文带你一同找回遗忘的ADSL密码.1.安全性较差的路由器(例如腾达的某些路由器):这里 ...
- Ubuntu 12.04 pppoe拨号问题
我的系统信息: Ubuntu 12.04.4 X64 Q001: 我学校需要使用pppoe拨号上网.我在宿舍架了个路由,可以使用无线连接拨号上网,也可以使用网线连接.在ubuntu下,使用无线连接时没 ...
- android移植pppoe拨号上网的全过程
硬件环境:Tiny6410开发板 软件环境:fedora14 + Android 2.3.4 + linux-2.6.36 所需资源:rp-pppoe-3.11.tar.gz http://www.r ...
- PPPoE拨号流程
PPPoE(Point to Point Protocol over Ethernet,基于以太网的点对点协议)的工作流程包含发现(Discovery)和会话(Session)两个阶段,发现阶段是无状 ...
- 动态ip、静态ip、pppoe拨号的区别
pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网.宽带拨号上网.指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网.还有大街上的WIFI热点也很多,如 ...
- MikroTik RouterOS安装后初始化配置(PPPOE拨号上网)
1.修改登入密码 路由器默认登入账号为admin,密码为空,强烈建议修改登入密码保证安全: 2.修改接口名称 选择Interface,切换到Ethernet标签,找到状态是R(run)的两个端口. 给 ...
- [na]小区网络-pppoe拨号认证原理及部署(panabit来管理)
以前搞网络时候,对小区宽带adsl上网(后ie中的pppoe拨号config)+对一坨人限速的系统(panabit)比较感兴趣,挺神秘. 以前写的,有些纰漏,抽时间我会陆陆续续补充下. PPPOE认证 ...
- 华为路由器pppoe拨号
一.概要 模拟pppoe 拨号 , 软件 ensp , 简单拓扑: 二.配置 1.基本环境配置 pc1 AR1 int gi 0/0/0 ip add 192.168.10.254 24 2.开始 ...
- 如何查看路由器中的pppoe拨号密码?
1 2 3 4 5 6 分步阅读 有时候把宽带的账号密码给忘了,进路由器的拨号页面看了一下,账号能看到,就密码是以“*”号形式显示的,没法用“肉眼”识别出来,怎么办呢?难道真的非得打电话问运营商不可? ...
随机推荐
- firefly的rpc。。
firefly使用了twisted的pb 来实现rpc: http://twistedmatrix.com/documents/current/core/howto/pb-usage.html 服务端 ...
- InSAR在地面沉降监测中的应用及发展前景
合成孔径雷达(Synthetic Aperture Radar,SAR)的概念始于20世纪50年代,是正在发展中的极具潜力的微波遥感技术.SAR具有全天时.全天候的工作能力,能够穿透云层,对某些地物具 ...
- PAT 1016
1016. Phone Bills (25) A long-distance telephone company charges its customers by the following rule ...
- Android中的距离单位
px 像素:每个px对应屏幕上面的一个点 dip或dp(device independent pixels 设备独立像素):一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dip=1px.但 ...
- VirtualBox中centos网络配置
VirtualBox图形界面下有四种网络接入方式,它们分别是: 1.NAT 网络地址转换模式(NAT,Network Address Translation) 2.Bridged Adapter 桥接 ...
- AT-Fragment
关于Fragment的粗略翻译 英文版api地址:Fragment(自备梯子) Fragment 类概述(Class Overview): Fragment是一种可以替换Activ ...
- 你真的会用UIButton吗? UIButton详细介绍
本节知识点: 什么是UIButton UIButton的状态 UIButton的属性设置 UIButton基本使用步骤 UIButton的代码创建与常用属性设置 重写按钮的某个状态属性的 setter ...
- 关于JFace中的输入值(InputDialog)对话框类
格式: InputDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue, In ...
- RPC之Thrift学习实战
关于Thrift的学习实战请参考:http://blog.csdn.net/column/details/slimina-thrift.html
- PHP 使用get_class_methods()和array_diff() 兩個相同的類中方法差集
进行二次开发时,习惯一份是原封不动的,一份正在修改.在修改时,发现修改的缺少原项目中的一些方法.本打算一个方法一个方法的对比,可是这样会比较花时间,划不来,PHP可以使用get_class_metho ...