关于RAS远程拨号

zhoutao 2000-05-22 10:50:00
各位高高手:
我在一个C/S程序中,需要通过RAS远程拨号API,但通过API调用太过繁琐,尤其在拨号端,要判断各种拨号状态(占线、无拨号音...)----我要完了!请问各位高高手,谁有较详细的例子,或者是RAS的通用类及调用步骤。
小生在这里谢过了。并献上50分,以表谢意。
...全文
301 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoutao 2000-05-30
  • 打赏
  • 举报
回复
我的答案:以供参考。
//---------------------------------------------------------------
// RasDialFunc
//
// call back function for the rasdial. As the
// connection state changes during dialing, this
// function is called.
//---------------------------------------------------------------
VOID CALLBACK RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
{
////////////////
if (dwError != 0)
{
char szBuf[256];
if ( RasGetErrorString( dwError, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, " RAS 拨号错误 (%ld).", dwError );
MessageBeep( MB_ICONEXCLAMATION );
RasHangUp( g_hRasConn );
AfxMessageBox( (LPSTR)szBuf, MB_OK and MB_ICONSTOP);
SendMessage(hRasHandle, WM_CLOSE, 0, 0);
return;
}

LPCTSTR lpszMsg;
switch ( rasconnstate )
{
case RASCS_OpenPort : lpszMsg = "Openning Port"; break;
case RASCS_PortOpened : lpszMsg = "Port Opened"; break;
case RASCS_ConnectDevice : lpszMsg = "Connecting Device"; break;
case RASCS_DeviceConnected : lpszMsg = "Device Connected"; break;
case RASCS_AllDevicesConnected : lpszMsg = "All Devices Connected"; break;
case RASCS_Authenticate : lpszMsg = "Starting Authentication"; break;
case RASCS_AuthNotify : lpszMsg = "Authentication Notify"; break;
case RASCS_AuthRetry : lpszMsg = "Authentication Retry"; break;
case RASCS_AuthCallback : lpszMsg = "Callback Requested"; break;
case RASCS_AuthChangePassword : lpszMsg = "Change Password Requested"; break;
case RASCS_AuthProject : lpszMsg = "Projection Phase Started"; break;
case RASCS_AuthLinkSpeed : lpszMsg = "Link Speed Calculation"; break;
case RASCS_AuthAck : lpszMsg = "Authentication Acknowledged"; break;
case RASCS_ReAuthenticate : lpszMsg = "Reauthenticatation Started"; break;
case RASCS_Authenticated : lpszMsg = "Authenticated"; break;
case RASCS_PrepareForCallback : lpszMsg = "Preparation For Callback"; break;
case RASCS_WaitForModemReset : lpszMsg = "Waiting For Modem Reset"; break;
case RASCS_WaitForCallback : lpszMsg = "Waiting For Callback"; break;
case RASCS_Interactive : lpszMsg = "Interactive"; break;
case RASCS_RetryAuthentication : lpszMsg = "Retry Authentication"; break;
case RASCS_CallbackSetByCaller : lpszMsg = "Callback Set By Caller"; break;
case RASCS_PasswordExpired : lpszMsg = "Password Expired"; break;
case RASCS_Disconnected : lpszMsg = "Disconnected"; break;
case RASCS_Connected : lpszMsg = "Connected"; break;
}
SendMessage(hRasWndTitle, WM_SETTEXT, 0, (LPARAM)lpszMsg);
}

bool CRasExDlg::Dial()
{
CWaitCursor wait;

RASDIALPARAMS rdParams;
memset(&rdParams, NULL, sizeof(RASDIALPARAMS));
rdParams.dwSize = sizeof(RASDIALPARAMS);
strcpy(rdParams.szPhoneNumber, m_pNumber);
strcpy(rdParams.szUserName, m_pUserName);
strcpy(rdParams.szPassword, m_pPassword);

/* RASCONNSTATUS rasconnstatus;
memset(&rasconnstatus, NULL, sizeof(RASCONNSTATUS));
rasconnstatus.dwSize = sizeof(RASCONNSTATUS);
RasGetConnectStatus(g_hRasConn, &rasconnstatus);
if(rasconnstatus.rasconnstate == RASCS_Connected) {
AfxMessageBox(IDS_STRING61461, MB_OK and MB_ICONSTOP);
CDialog::OnOK();
}
*/
g_hRasConn = NULL;
// RasDial(NULL, NULL, &rdParams, NULL, (RASDIALFUNC)RasDialFunc, &g_hRasConn);
DWORD dwRet = RasDial( NULL, NULL, &rdParams, 0L, NULL, &g_hRasConn );

wait.Restore();

if ( dwRet == 0 ) {
CString string;
string.LoadString(IDS_STRING61455);
MessageBox(string, "拨号成功", MB_OK);
SendMessage(WM_CLOSE, 0, 0);
return true;
}
else {
char szBuf[256];
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, " RAS拨号错误 (%ld).", dwRet );
RasHangUp( g_hRasConn );
MessageBox( (LPSTR)szBuf, "拨号错误", MB_OK and MB_ICONSTOP );
SendMessage(WM_CLOSE, 0, 0);
return false;
}
}

bool CRasExDlg::Hangup()
{
RASCONN ras[20];
DWORD dSize, dNumber;
char szBuf[256];
CString string;

ras[0].dwSize = sizeof( RASCONN );
dSize = sizeof( ras ); // Get active RAS - Connection
DWORD dwRet = RasEnumConnections( ras, &dSize, &dNumber );
if ( dwRet != 0 )
{
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "未知的RAS枚举连接错误 (%ld).", dwRet );
MessageBox( (LPSTR)szBuf, "拨号断开", MB_OK and MB_ICONSTOP );
SendMessage(WM_CLOSE, 0, 0);
return false;
}
bool bOK = true;
for( DWORD dCount = 0; dCount < dNumber; dCount++ )
{ // Hang up that connection
HRASCONN hRasConn = ras[dCount].hrasconn;
DWORD dwRet = RasHangUp( hRasConn );
if ( dwRet != 0 )
{
char szBuf[256];
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "Undefined RAS HangUp Error (%ld).", dwRet );
MessageBox( (LPSTR)szBuf, "拨号断开", MB_OK and MB_ICONSTOP );
bOK = false;
}
else {
//Wait in loop until RAS state machine exits.
//Sleep(3000);
RASCONNSTATUS rasStatus;
rasStatus.dwSize = sizeof(RASCONNSTATUS);
while( RasGetConnectStatus(hRasConn,&rasStatus) != ERROR_INVALID_HANDLE ){}
}
}

if(bOK == true) {
string.LoadString(IDS_STRING61457);
MessageBox( string, "拨号断开", MB_OK );
}
else {
string.LoadString(IDS_STRING61459);
MessageBox( string, "拨号断开", MB_OK and MB_ICONSTOP );
}

SendMessage(WM_CLOSE, 0, 0);

return bOK;
}

void CRasExDlg::UpdateRasStats()
{
RASCONNSTATUS rasconnstatus;
memset(&rasconnstatus, NULL, sizeof(RASCONNSTATUS));
rasconnstatus.dwSize = sizeof(RASCONNSTATUS);
RasGetConnectStatus(g_hRasConn, &rasconnstatus);
if(rasconnstatus.rasconnstate == RASCS_Connected)
m_IsDial = TRUE;
else if(rasconnstatus.rasconnstate == RASCS_Disconnected)
m_IsDial = FALSE;
// ERROR_INVALID_HANDLE
/* DWORD dw = 0,nBufferSize = sizeof(RASCONN) * 4,w = 0;
RASCONN pRasConn[4];
memset(pRasConn,'\0',sizeof(RASCONN)*4);
pRasConn->dwSize = sizeof(RASCONN);
w = RasEnumConnections(pRasConn, &nBufferSize, &dw);
if (w != 0) DisplayError(w);
else if (dw > 0) {
// TaskBarIconModify(g_hIcons[1],pRasConn->szEntryName);
} else {
// TaskBarIconModify(g_hIcons[0],_T("No Connection"));
}
*/
}

void CRasExDlg::DisplayError(DWORD dw)
{
CString string;
TCHAR szBuf[256];
memset(szBuf, NULL, 256);
RasGetErrorString( dw, (LPSTR)szBuf, 256 );
if(szBuf[0] == 0x00) {
if(dw == 6)
string.LoadString(IDS_STRING61460);
else string.LoadString(IDS_STRING61454);
memcpy(szBuf, string, string.GetLength() );
}
AfxMessageBox( (LPSTR)szBuf, MB_OK and MB_ICONSTOP);
}

BOOL CRasExDlg::OnInitDialog()
{
CDialog::OnInitDialog();

hRasHandle = this->m_hWnd;
hRasWndTitle = (GetDlgItem(IDC_STATICTEXT))->m_hWnd;
if (m_IsStatus == TRUE) {
m_Text = "正在进行拨号,请等待...";
UpdateData(FALSE);
}
else {
m_Text = "正在断开拨号,请等待...";
UpdateData(FALSE);
}
SetTimer(1, 500, NULL);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

void CRasExDlg::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 1:
KillTimer(1);
if (m_IsStatus == TRUE) Dial();
else Hangup();
break;
default:
break;
}

CDialog::OnTimer(nIDEvent);
}

void CRasExDlg::OnMycancel()
{
//UpdateRasStats();
//if(m_IsDial == TRUE)
Hangup();
CDialog::OnCancel();
}
Un1 2000-05-30
  • 打赏
  • 举报
回复
To GUID:

RAS连接后, 使用Winsock连接.无须理会硬件.
Un1 2000-05-30
  • 打赏
  • 举报
回复
当然用过!

http://210.77.145.209/csdn/softs/softview.asp?id=456
半宫佳丽 2000-05-25
  • 打赏
  • 举报
回复
用RAS拨号后,请问我该如何发送数据呢?用AT指命吗?除些还有别的办法吗?
zhoutao 2000-05-24
  • 打赏
  • 举报
回复
我的E-Mail: zhoutao@china.com
谢谢!
maolian 2000-05-24
  • 打赏
  • 举报
回复
到 www.vchelp.net上下载,大量例子
Un1 2000-05-23
  • 打赏
  • 举报
回复
下载一个“多线程RAS控件”试试!
zhoutao 2000-05-23
  • 打赏
  • 举报
回复
哪里有?你用过吗?请Mail给我好吗?
1.1、GetIP(获取IP地址程序)
GetHostByName(使用GetHostByName函数获取IP程序)
WSAAsyncGetHostByName(使用WSAAsyncGetHostByName函数获取IP地址程序)
MultiIP(多IP情况的处理程序)
ReadIP and IP(关于IP地址和实际的地址的区别)
1.2、GetNetMask(Windows NT&98系统中获取子网掩码)
1.3、获取计算机名(获取或设置本地机和远程计算机名)
1.4、在线检测(网络连接情况检测)
1.5、DNS的更改和设置(获取DNS设置)
1.6、MAC Addr(网卡信息的获取)
3.1、FTP-API(使用API函数实现FTP客户端程序)
3.2、FTP服务器(FTP服务器程序,实现了FTP服务的大部分功能)
4.1、HTTPGET(使用HTTP协议下载web服务器上的文件或网页)
4.2、WebProxy(实现了Web代理服务器的程序,可以让多个局域网的计算机通过该代理上网)
4.3、Webserver(Web服务器程序,运行该程序可以建立自己的网页服务器)
5.1、telnet(实现了远程登录的客户端功能,使用它可以上BBS)
5.2、TelnetProxy(实现了telnet代理服务器功能的程序)
6.1、mail2000(实现了收发Email的功能,并且能够分析email信件结构,发送附件等)
7.1、netmon(网络流量统计的程序)
7.2、tcplist(网络连接监控的程序)
7.3、tcpipmon(网络配置和统计的使用实例)
7.4、LanFind(局域网资源搜索程序)
8.1、Modem-client(Modem文件传输的客户端程序)
8.2、Modem-server(Modem文件传输的服务器程序)
9.1、RAS-Code(RAS拨号上网程序)
10.1、tfax(通过计算机发送传真的程序)

所有代码在delphi6.0中调试通过。1.GetIP(获取IP地址程序)-GetHostByName(使用GetHostByName函数获取IP程序)-WSAAsyncGetHostByName(使用WSAAsyncGetHostByName函数获取IP地址程序)-MultiIP(多IP情况的处理程序)-ReadIP and IP(关于IP地址和实际的地址的区别)2.GetNetMask(Windows NT&98系统中获取子网掩码)3.获取计算机名(获取或设置本地机和远程计算机名)4.目在线检测(网络连接情况检测)5.DNS的更改和设置(获取DNS设置)6.MAC Addr(网卡信息的获取)7.FTP-API(使用API函数实现FTP客户端程序)8.FTP服务器(FTP服务器程序,实现了FTP服务的大部分功能)9.HTTPGET(使用HTTP协议下载web服务器上的文件或网页)10.WebProxy(实现了Web代理服务器的程序,可以让多个局域网的计算机通过该代理上网)11.Webserver(Web服务器程序,运行该程序可以建立自己的网页服务器)12.telnet(实现了远程登录的客户端功能,使用它可以上BBS)13.TelnetProxy(实现了telnet代理服务器功能的程序)14.mail2000(实现了收发Email的功能,并且能够分析email信件结构,发送附件等)15.netmon(网络流量统计的程序)16.tcplist(网络连接监控的程序)17.tcpipmon(网络配置和统计的使用实例)18.LanFind(局域网资源搜索程序)19.Modem-client(Modem文件传输的客户端程序)20.Modem-server(Modem文件传输的服务器程序)21.RAS-Code(RAS拨号上网程序)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧