Ras拨号 CODE: C /C++
2008-04-04 22:54
Ras拨号 CODE: C /C++
刚刚在autoit板上看到狮子的关于adsl拨号脚本的帖子,正好这两天在做关于ras的程序,C的中文资料不多,在这里简单介绍一下了
//==========================
//建立连接
HRASCONN CreateDials(lpconnNotify lpcn)
{
RASDIALPARAMS lpParams={0};//初始化RASDIALPARAMS结构
//memset(&lpRasDialParams,'\0',sizeof(lpRasDialParams));
lpParams.dwSize=sizeof(lpParams);
wcscpy(lpParams.szEntryName,L"vpnc");//使用RasGetEntryDialParams时entryname也需要第一指定
//==========================
//建立连接
HRASCONN CreateDials(lpconnNotify lpcn)
{
RASDIALPARAMS lpParams={0};//初始化RASDIALPARAMS结构
//memset(&lpRasDialParams,'\0',sizeof(lpRasDialParams));
lpParams.dwSize=sizeof(lpParams);
wcscpy(lpParams.szEntryName,L"vpnc");//使用RasGetEntryDialParams时entryname也需要第一指定
wcscpy(lpParams.szPassword,lpcn->pass);
wcscpy(lpParams.szUserName,lpcn->user);
wcscpy(lpParams.szPhoneNumber,lpcn->addr);
lpParams.dwSubEntry=1;
Sleep(lpcn->delay*1000);
HRASCONN rasconn=NULL; //不初始化拨号668错误
DWORD dwResult=RasDial(NULL,lpcn->phonebook,&lpParams,0,NULL,&rasconn);
if (dwResult==ERROR_SUCCESS)
{
TCHAR ftemp[MAX_PATH];
DWORD tid=0;
wcscpy(ftemp,L"/c ");
wcscat(ftemp,lpcn->targetpath);
StartApp(ftemp);
wcscpy(lpParams.szUserName,lpcn->user);
wcscpy(lpParams.szPhoneNumber,lpcn->addr);
lpParams.dwSubEntry=1;
Sleep(lpcn->delay*1000);
HRASCONN rasconn=NULL; //不初始化拨号668错误
DWORD dwResult=RasDial(NULL,lpcn->phonebook,&lpParams,0,NULL,&rasconn);
if (dwResult==ERROR_SUCCESS)
{
TCHAR ftemp[MAX_PATH];
DWORD tid=0;
wcscpy(ftemp,L"/c ");
wcscat(ftemp,lpcn->targetpath);
StartApp(ftemp);
return rasconn;
}
else
{
TCHAR connecterr[30];
wsprintf(connecterr,L"connect failure: %i",dwResult);
if (Dialcount<3 )
{
Dialcount++;
return CreateDials(lpcn);//
}
else
LogEvent(connecterr);
}
}
/
}
else
{
TCHAR connecterr[30];
wsprintf(connecterr,L"connect failure: %i",dwResult);
if (Dialcount<3 )
{
Dialcount++;
return CreateDials(lpcn);//
}
else
LogEvent(connecterr);
}
}
/
/连接状态事件
BOOL ConnectNotify(lpconnNotify lpcn)
{
HANDLE connEvent=NULL;
connEvent=CreateEvent(NULL,FALSE,TRUE,NULL);
while(TRUE)
{
if (WaitForSingleObject(connEvent,INFINITE)==WAIT_OBJECT_0)
lpcn->rasconn=CreateDials(lpcn);
autoitRasConnectionNotification(lpcn->rasconn,connEvent,RASCN_Disconnection);
}
return FALSE;
}
//===============================
BOOL ConnectNotify(lpconnNotify lpcn)
{
HANDLE connEvent=NULL;
connEvent=CreateEvent(NULL,FALSE,TRUE,NULL);
while(TRUE)
{
if (WaitForSingleObject(connEvent,INFINITE)==WAIT_OBJECT_0)
lpcn->rasconn=CreateDials(lpcn);
autoitRasConnectionNotification(lpcn->rasconn,connEvent,RASCN_Disconnection);
}
return FALSE;
}
//===============================
Xisat@ 2008-03-011 转载请保留作者信息,感谢
//==================================
大概介绍一下主要的几个部分
1. RASDIALPARAMS结构
为RasDial 提供连接参数
该结构定义为
typedef struct _RASDIALPARAMS {
DWORD dwSize; //结构大小 实际使用中sizeof()就可以
TCHAR szEntryName[RAS_MaxEntryName + 1]; //拨号入口(如果使用默认的phone-book这里就是指向拨号连接的名称)
TCHAR szPhoneNumber[RAS_MaxPhoneNumber + 1]; //拨号号码,如果是vpn这里指定的是服务器地址
TCHAR szCallbackNumber[RAS_MaxCallbackNumber + 1];//回叫号码
TCHAR szUserName[UNLEN + 1]; //用户名
//==================================
大概介绍一下主要的几个部分
1. RASDIALPARAMS结构
为RasDial 提供连接参数
该结构定义为
typedef struct _RASDIALPARAMS {
DWORD dwSize; //结构大小 实际使用中sizeof()就可以
TCHAR szEntryName[RAS_MaxEntryName + 1]; //拨号入口(如果使用默认的phone-book这里就是指向拨号连接的名称)
TCHAR szPhoneNumber[RAS_MaxPhoneNumber + 1]; //拨号号码,如果是vpn这里指定的是服务器地址
TCHAR szCallbackNumber[RAS_MaxCallbackNumber + 1];//回叫号码
TCHAR szUserName[UNLEN + 1]; //用户名
TCHAR szPassword[PWLEN + 1]; //密码
TCHAR szDomain[DNLEN + 1] ; //域名
#if (WINVER >= 0x401)
DWORD dwSubEntry;//子入口
ULONG_PTR dwCallbackId;//RasDial回调函数标志
#endif
} RASDIALPARAMS;
使用中需要指明的项就看实际要求了,我这里是做一个vpn拨号,修改了以下几项
lpParams.dwSize=sizeof(lpParams);
wcscpy(lpParams.szEntryName,L"vpnc");
wcscpy(lpParams.szPassword,lpcn->pass);
wcscpy(lpParams.szUserName,lpcn->user);
wcscpy(lpParams.szPhoneNumber,lpcn->addr);
//===============================
TCHAR szDomain[DNLEN + 1] ; //域名
#if (WINVER >= 0x401)
DWORD dwSubEntry;//子入口
ULONG_PTR dwCallbackId;//RasDial回调函数标志
#endif
} RASDIALPARAMS;
使用中需要指明的项就看实际要求了,我这里是做一个vpn拨号,修改了以下几项
lpParams.dwSize=sizeof(lpParams);
wcscpy(lpParams.szEntryName,L"vpnc");
wcscpy(lpParams.szPassword,lpcn->pass);
wcscpy(lpParams.szUserName,lpcn->user);
wcscpy(lpParams.szPhoneNumber,lpcn->addr);
//===============================
Xisat@ 2008-03-011 转载请保留作者信息,感谢
//==================================
2. RasDial函数
MSDN 上的说明是
The RasDial function establishes a RAS connection between a RAS client and a RAS server. The connection data includes callback and user-authentication information.
大意是可以在Ras客户端和Ras服务器之间建立一个Ras连接,连接数据包括回调和用户验证信息
Ras是什么?
remote access service 远程访问服务 拨号就是Ras连接的请求过程
RasDial函数的使用稍微复杂些,可以有许多的变化
声明如下
DWORD RasDial(
__in LPRASDIALEXTENSIONS lpRasDialExtensions, //拨号的扩展参数
__in LPCTSTR lpszPhonebook,//电话本
//==================================
2. RasDial函数
MSDN 上的说明是
The RasDial function establishes a RAS connection between a RAS client and a RAS server. The connection data includes callback and user-authentication information.
大意是可以在Ras客户端和Ras服务器之间建立一个Ras连接,连接数据包括回调和用户验证信息
Ras是什么?
remote access service 远程访问服务 拨号就是Ras连接的请求过程
RasDial函数的使用稍微复杂些,可以有许多的变化
声明如下
DWORD RasDial(
__in LPRASDIALEXTENSIONS lpRasDialExtensions, //拨号的扩展参数
__in LPCTSTR lpszPhonebook,//电话本
__in LPRASDIALPARAMS lpRasDialParams,//拨号参数
__in DWORD dwNotifierType,//回调类型
__in LPVOID lpvNotifier,//回调函数
__in LPHRASCONN lphRasConn//连接句柄
);
参数一,我没有使用过
参数二,电话本这里可以指向一个已建立的*.pbk文件或者留空默认
参数三,上面介绍的结构体
参数四五,为拨号过程提供回调信息
参数六,连接句柄,检测连接状态需要
3. RasConnectionNotification函数
这个函数比较有趣,可以在指定连接句柄发生指定事件时触发一个用户事件
听起来有些拗口,简单说就是可以在连接断开的时候触发一个用户事件,这时候只要循环一个信号检测
__in DWORD dwNotifierType,//回调类型
__in LPVOID lpvNotifier,//回调函数
__in LPHRASCONN lphRasConn//连接句柄
);
参数一,我没有使用过
参数二,电话本这里可以指向一个已建立的*.pbk文件或者留空默认
参数三,上面介绍的结构体
参数四五,为拨号过程提供回调信息
参数六,连接句柄,检测连接状态需要
3. RasConnectionNotification函数
这个函数比较有趣,可以在指定连接句柄发生指定事件时触发一个用户事件
听起来有些拗口,简单说就是可以在连接断开的时候触发一个用户事件,这时候只要循环一个信号检测
while(TRUE)
{
if (WaitForSingleObject(connEvent,INFINITE)==WAIT_OBJECT_0)//等待事件信号
lpcn->rasconn=CreateDials(lpcn);//如果有信号,则重拨
RasConnectionNotification(lpcn->rasconn,connEvent,RASCN_Disconnection);//连接断开时触发事件信号
}
就可以轻易的捕捉到断开,简单的实现断线重拨了
//======================================
时间不早,写得比较匆忙,有空再补充一下吧,这里只是rasapi应用中的一角,有什么问题可以我或者放出大家一起讨论。
更多信息请参见MSDN
{
if (WaitForSingleObject(connEvent,INFINITE)==WAIT_OBJECT_0)//等待事件信号
lpcn->rasconn=CreateDials(lpcn);//如果有信号,则重拨
RasConnectionNotification(lpcn->rasconn,connEvent,RASCN_Disconnection);//连接断开时触发事件信号
}
就可以轻易的捕捉到断开,简单的实现断线重拨了
//======================================
时间不早,写得比较匆忙,有空再补充一下吧,这里只是rasapi应用中的一角,有什么问题可以我或者放出大家一起讨论。
更多信息请参见MSDN
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论