前一段时间使用了Socket与远程PC进行UDP通讯,使用了一个RAS拨号类,与大家分享一下。

在使用下面的代码建立 TCP/IP 链接前,请断开 ActiveSync,否则会导致失败。

头文件:RasCtrl.h

#if !defined _RAS_PPP_CTRL_H_ #define _RAS_PPP_CTRL_H_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "ras.h" class CRasCtrl { private: LPVOID m_MsgHandle; HRASCONN m_hRasConn; //BOOL bConnect; //CString m_UserName; //CString m_PassWord; CString m_EntryName; public: CRasCtrl(); virtual ~CRasCtrl(); //拨号 bool DialUp(CString UserName,CString Password); //挂断 bool HangUp(); //设置处理方式 void SetHandle(LPVOID _handle); bool IsConnect(void); //通过获取WM_RASDIALEVENT消息,判断拨号状态 //static CString GetState(unsigned int message); }; #endif

源文件:RasCtrl.cpp

#include "stdafx.h" #include "RasCtrl.h" #include "ras.h" #include "Raserror.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif // // Construction/Destruction // CRasCtrl::CRasCtrl() { m_hRasConn = NULL; //bConnect = false; m_EntryName = L"MyLink"; //建立拨号的名字,保持一致 } CRasCtrl::~CRasCtrl() { HangUp(); } bool CRasCtrl::DialUp(CString UserName,CString Password) { RASDIALPARAMS rdParams; //拨号连接的信息 ZeroMemory(&rdParams, sizeof(RASDIALPARAMS)); rdParams.dwSize = sizeof(RASDIALPARAMS); //HangUp(); //Sleep(100); //RasSetEntryDialParams(NULL,&rdParams,true); //RasGetEntryProperties(); wcscpy(rdParams.szEntryName, m_EntryName); wcscpy(rdParams.szUserName, UserName); wcscpy(rdParams.szPassword, Password); //lstrcpy(rdParams.szPhoneNumber, _T("")); //lstrcpy(rdParams.szDomain, _T("")); m_hRasConn = NULL; DWORD dwRet = ::RasDial(NULL, NULL, &rdParams, 0xFFFFFFFF, m_MsgHandle , &m_hRasConn); //如果函数成功,则返回0 //也可以RasHangUp(m_hRasConn);挂断,不过我曾经试过拨号成功m_hRasConn为NULL的情况,一时不清除怎么回事,所以把挂断函数改了。 //RasDial函数的使用要小心一点跟windows平台有些差异。 //DWORD iRet = GetLastError(); if (dwRet) { //bConnect = false; return false; } //bConnect = true; return true; } bool CRasCtrl::HangUp() { int index; // An integer index DWORD dwError, // Error code from a function call dwRasConnSize, // Size of RasConn in bytes dwNumConnections; // Number of connections found RASCONN RasConn[20]; // Buffer for connection state data // Assume the maximum number of entries is 20. // Assume no more than 20 connections. RasConn[0].dwSize = sizeof (RASCONN); dwRasConnSize = 20 * sizeof (RASCONN); // Find all connections. if (dwError = RasEnumConnections (RasConn, &dwRasConnSize, &dwNumConnections)) { return false; } // If there are no connections, return zero. if (!dwNumConnections) { return false; } // Terminate all of the remote access connections. for (index = 0; index < (int)dwNumConnections; ++index) { //这样做主要是不想关掉usb连接,因为通过这种方法得到的连接中包括了USB同步的连接。 if (wcsstr(RasConn[index].szEntryName,_T("MyLink"))!=NULL) { if (dwError = RasHangUp (RasConn[index].hrasconn)) { return false; } } } return TRUE; } // 传递接收消息的窗体句柄进来,这样窗体才能接收到WM_RASDIALEVENT消息。 // wParam的值有RASCS_Connected,RASCS_Disconnected等,具体查看msdn // wince不支持其他方式。 void CRasCtrl::SetHandle(LPVOID _handle) { m_MsgHandle = _handle; } bool CRasCtrl::IsConnect(void) { if(NULL != m_hRasConn) { RASCONNSTATUS rasConStatus; rasConStatus.dwSize = sizeof(RASCONNSTATUS); RasGetConnectStatus(m_hRasConn,&rasConStatus); if(RASCS_Connected == rasConStatus.rasconnstate) { return true; } } return false; } /* 这个用于解析PPPoE返回的消息的 CString CRasCtrl::GetState(unsigned int message) { CString str; switch(message) { ... ... ... case RASCS_Connected: str= LoadStringEx(IDS_LINKED); break; case RASCS_Disconnected: str= LoadStringEx(IDS_UNLINKED); break; } return str; } */

判断链接是否已经建立:在主窗体上启动一Timer

if(RASDIAL_NETSHOW_TIMERID == nIDEvent) { CString csConnecting; giRasDialTimerCount++; csConnecting.Format(L"正在建立链接(%02d)",giRasDialTimerCount); GetDlgItem(IDC_CONNECTSTATUS)->SetWindowText(csConnecting); if(m_RasConnect.IsConnect()) { RETAILMSG(1,(L"UDP Client,Ras net available{%d}/r/n",giRasDialTimerCount)); KillTimer(nIDEvent); giRasDialTimerCount = 0; csConnecting.Format(L"建立链接成功"); GetDlgItem(IDC_CONNECTSTATUS)->SetWindowText(csConnecting); GetDlgItem(IDC_BTNOPEN2)->EnableWindow(FALSE); GetDlgItem(IDC_BTNOPEN3)->EnableWindow(TRUE); } else { RETAILMSG(1,(L"UDP Client,Ras net not available{%d}/r/n",giRasDialTimerCount)); } }

使用:

1)建立链接:m_RasConnect.DialUp(L"",L"");

2)断开链接:

if(m_RasConnect.IsConnect()) { m_RasConnect.HangUp(); }

说明:此文章只是建立 TCP/IP 链接的过程,使用UDP通讯部分的内容将会在下一篇文章中说明。

RAS使用拨号网络拨号的类相关推荐

  1. 如何让计算机断开网络连接网络设置,拨号网络怎么设置连接和断开

    不少网友因为一些误操作,导致拨号网络被断开了,应该怎么连接回去呢?学习啦小编在这里给大家介绍拨号网络的设置连接以及断开,希望能帮到大家. 调制解调器器安装完成,线路也连接好了,接下来我们要如何做才能连 ...

  2. 拨号时显示无法连接服务器失败,拨号网络常见的错误提示解释及解决方法大全...

    Error 602 The port is already open 问题:拨号网络由于设备安装错误或正在使用,不能进行连接. 原因:RasPPPoE没有完全和正确安装. 解决:在win7系统卸载干净 ...

  3. Bluetooth DUN 蓝牙拨号网络 (http://blog.sina.com.cn/s/blog_59b22a2e0100ildk.html)

    Bluetooth DUN 蓝牙拨号网络 (2010-05-13 14:21:56) 转载▼ 标签: 杂谈 分类: MTK 蓝牙拨号网络(DUN)是一种无线上网技术,是指连接到互联网的使用蓝牙手机作为 ...

  4. php拨号接口,拨号网络对应的协议是什么

    拨号网络对应的协议是PPPoE. PPPoE(英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ether ...

  5. 【Android 逆向】Android 逆向通用工具开发 ( 静态库项目中的网络操作核心类 CNetwork 分析 )

    文章目录 一.adabingo 静态库项目中的网络操作核心类 CNetwork 分析 一.adabingo 静态库项目中的网络操作核心类 CNetwork 分析 CNetwork 相关方法分析 : 等 ...

  6. windows 中 vpn连接提示, 虚拟专用网络 由于RAS/虚拟专用网络,服务器上配置的某个策略,服务器用于验证用户名和密码的身份验证方法可能与连接配置文件中的身份证验证方法不匹配

    windows 虚拟专用网络 由于RAS/虚拟专用网络,服务器上配置的某个策略,服务器用于验证用户名和密码的身份验证方法可能与连接配置文件中的身份证验证方法不匹配 打开网络 更换网络适配器 选项 右键 ...

  7. Keras:Unet网络实现多类语义分割方式

    Keras:Unet网络实现多类语义分割方式 更多python视频教程请到菜鸟教程https://www.piaodoo.com/ 1 介绍 U-Net最初是用来对医学图像的语义分割,后来也有人将其应 ...

  8. 网络约炮类应用缘何层出不穷?

    豆瓣约炮体.网络约炮女.约炮神器等各类话题往往很是吸引人们的眼球.不断爆出的新闻.消息也更是让约炮这个词语火了起来.深入探究后发现,原来约炮的兴起竟与APP应用的发展息息相关.下面,我们就从几个方面, ...

  9. 网路游侠:网络协议分析类产品简析

    目前网络协议分析类产品火爆的很,游侠(www.youxia.org)其实在几年前就在关注这个市场,目前应该说已经做的如火如荼,但是貌似依然有很多人对这类产品认识有偏差,简单说几句: 网络协议分析类产品 ...

最新文章

  1. ionic4中使用Swiper触屏滑动--技术
  2. JavaScript基本知识
  3. Spring MVC前后端的数据传输
  4. 梦想成现实:用xUnit.net在单元测试中实现构造函数依赖注入
  5. EOJ Monthly 2018.11 D. 猜价格
  6. web播放器(falsh,audio)
  7. FFPEG 转码记录------解决了有流,但是没有码率和FPS?
  8. 程序员是吃青春饭的吗?未来发展前途如何?
  9. 如何解决创建Account时的error message BP category 2 does not fit the data in category 1
  10. 服务器性能优化的8种常用方法
  11. 根据序列选择自回归模型(AR、ARMA、VAR、VMA、VECH)
  12. 从零开始刷Leetcode——数组(581.605.628)
  13. 【B/S】java(4)
  14. pycharm编程工具自带python环境_Python IDE专用编辑器PyCharm下载及配置安装过程(Ubuntu环境)...
  15. 工大瑞普 NP-OSPF综合实验
  16. php mysql知识总结_Mysql数据库知识总结(看资料总结出来的)
  17. 使用android busybox拷贝文件到qnx系统
  18. 前端上传组件Plupload
  19. macos备份文件服务器地址,mac电脑备份文件的最佳方法
  20. 【STM32H7教程】第93章 STM32H7的SPI总线应用之驱动ADS1256(8通道24bit ADC, 增益可编程)

热门文章

  1. 正则表达式匹配字符串(scala)
  2. koa2使用ioredis存储session
  3. python 线程函数传参
  4. PoE交换机的多种连接方式 PoE交换机的4种连接方式
  5. 马云又在“吹牛”了:让世界都没有难做的生意
  6. 如何才能招聘到合适的以太坊区块链开发者
  7. ES6-Promise简介
  8. python中__init__.py的用法,执行指定的多个.py文件生成报告。简单粗暴1
  9. layer打开iframe弹层,传递与接收参数
  10. PyCharm关闭更新提示