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拨号的更多相关文章

  1. 破解TP-Link路由-嗅探PPPoE拨号密码

    如果你平时都使用路由器直接上网,那么你还记得你的宽带(ADSL)帐户名和密码吗?忘记密码后又该如何找回呢?别急,本文带你一同找回遗忘的ADSL密码.1.安全性较差的路由器(例如腾达的某些路由器):这里 ...

  2. Ubuntu 12.04 pppoe拨号问题

    我的系统信息: Ubuntu 12.04.4 X64 Q001: 我学校需要使用pppoe拨号上网.我在宿舍架了个路由,可以使用无线连接拨号上网,也可以使用网线连接.在ubuntu下,使用无线连接时没 ...

  3. android移植pppoe拨号上网的全过程

    硬件环境:Tiny6410开发板 软件环境:fedora14 + Android 2.3.4 + linux-2.6.36 所需资源:rp-pppoe-3.11.tar.gz http://www.r ...

  4. PPPoE拨号流程

    PPPoE(Point to Point Protocol over Ethernet,基于以太网的点对点协议)的工作流程包含发现(Discovery)和会话(Session)两个阶段,发现阶段是无状 ...

  5. 动态ip、静态ip、pppoe拨号的区别

    pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网.宽带拨号上网.指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网.还有大街上的WIFI热点也很多,如 ...

  6. MikroTik RouterOS安装后初始化配置(PPPOE拨号上网)

    1.修改登入密码 路由器默认登入账号为admin,密码为空,强烈建议修改登入密码保证安全: 2.修改接口名称 选择Interface,切换到Ethernet标签,找到状态是R(run)的两个端口. 给 ...

  7. [na]小区网络-pppoe拨号认证原理及部署(panabit来管理)

    以前搞网络时候,对小区宽带adsl上网(后ie中的pppoe拨号config)+对一坨人限速的系统(panabit)比较感兴趣,挺神秘. 以前写的,有些纰漏,抽时间我会陆陆续续补充下. PPPOE认证 ...

  8. 华为路由器pppoe拨号

    一.概要 模拟pppoe 拨号 , 软件 ensp  , 简单拓扑: 二.配置 1.基本环境配置 pc1 AR1 int gi 0/0/0 ip add 192.168.10.254 24 2.开始 ...

  9. 如何查看路由器中的pppoe拨号密码?

    1 2 3 4 5 6 分步阅读 有时候把宽带的账号密码给忘了,进路由器的拨号页面看了一下,账号能看到,就密码是以“*”号形式显示的,没法用“肉眼”识别出来,怎么办呢?难道真的非得打电话问运营商不可? ...

随机推荐

  1. PHP中获取中英文混合字符串长度[主要是指个数,而不是字符串长度](转)

    今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数. $str = 'Hello world!'; echo strlen($str);   ...

  2. Model

    using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace iFlytekDemo ...

  3. 【转】IT职场人生系列之四:怎样写简历

    本文是IT职场人生系列的第四篇. 因为早年跳槽无数,所以积累了不少"技巧",逐渐变成写简历的"专家",最长的时候简历到了12页,所以现在练就一手写长篇博客的功夫 ...

  4. 安装opencms时遇到问题及解决方法

    1. MySQL system variable 'max_allowed_packet' http://blog.csdn.net/hqa_ii/article/details/6872367 安装 ...

  5. Getting started: A skeleton application

    Getting started: A skeleton application In order to build our application, we will start with theZen ...

  6. CSS 之 清除 float 常用的方法

    大多数前端使用.clearfix:after{ .....}  和 .clearit{....}的组合来清除浮动. 前端开发经常用到浮动 float:left; float:right; 有浮动就需要 ...

  7. OC中-方法到底是如何使用的?

    方法:方法是Objective-C独有的一种结构,只能在Objective-C中声明.定义和使用,C语言不能声明.定义和使用. 1.类方法以+号开头,对象方法以-号开头+ (void) init;  ...

  8. PHP数据库结果集处理

    mysql连接成功后可以用msql_query来获得一个资源型的结果集. $sql = 'select * from emp_info';$result = mysqli_query($link,$s ...

  9. GCC生成的汇编代码

    假设我们写了一个C代码文件 code.c包含下面代码: int accum = 0; int sum(int x, int y){ int t = x + y; accum += t; return ...

  10. svn管理代码在cornerstone上无法添加.a 静态库文件

    有时候.a静态库不能上传到svn的服务器  导致别人拉代码运行不了 这是因为cornerstone设置里面默认不会提交.a文件, 在上图选项栏里是cornerstone默认忽略上传的文件名后缀,在这里 ...