首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > windows >

wince下调用RasDial进行VPN拨号出现错误

2012-12-19 
【求助】wince上调用RasDial进行VPN拨号出现异常环境:wince6.0;使用USB线连接电脑;vpn拨号到局域网里的另外

【求助】wince上调用RasDial进行VPN拨号出现异常
环境:wince6.0;使用USB线连接电脑;vpn拨号到局域网里的另外一台机子

代码如下:


#ifndef _WIN32_WCE
LPCTSTR CVPN::m_sszVPNDeviceNamePPTP = _T("WAN 微型端口 (PPTP)");
LPCTSTR CVPN::m_sszVPNDeviceNameL2TP = _T("WAN 微型端口 (L2TP)");
#else
LPCTSTR CVPN::m_sszVPNDeviceNamePPTP = _T("RAS VPN Line 2");
#endif //_WIN32_WCE

// 记录vpn连接句柄
if (m_hRasVPNConn)
{
RasHangUp(m_hRasVPNConn);
m_hRasVPNConn = NULL;
}

// 初始化输出参数
strVPNLocalIPAddr.Empty();

RASDEVINFO rasdevinfo[100];
ZeroMemory(&rasdevinfo[0], sizeof(RASDEVINFO) * 100);
rasdevinfo[0].dwSize = sizeof(RASDEVINFO);
DWORD dwrasdevinfosize = sizeof(RASDEVINFO) * 100;
DWORD dwrasdevcount = 0;
RasEnumDevices(&rasdevinfo[0], &dwrasdevinfosize, &dwrasdevcount);
CString strallrasdevinfo;
for (int n = 0; n < dwrasdevcount; n++)
{
CString strrasdevinfo;
strrasdevinfo.Format(_T("devicetype:%s;    devicename:%s"), 
rasdevinfo[n].szDeviceType, rasdevinfo[n].szDeviceName);
strallrasdevinfo += strrasdevinfo + _T("\n");
}

// 删除旧的vpn连接
TCHAR szEntryName[RAS_MaxEntryName + 1];
ZeroMemory(szEntryName, RAS_MaxEntryName + 1);
_tcscpy(szEntryName, g_LangCfg.GetVpnEntryName());
RasDeleteEntry(NULL, szEntryName);

// 创建vpn连接
RASENTRY rasentry;
ZeroMemory(&rasentry, sizeof(RASENTRY));
rasentry.dwSize = sizeof(RASENTRY);
rasentry.dwfOptions |= RASEO_RemoteDefaultGateway
| RASEO_IpHeaderCompression
| RASEO_RequireEncryptedPw | RASEO_RequireDataEncryption | RASEO_RequireMsEncryptedPw
| RASEO_SwCompression;
_tcscpy(rasentry.szLocalPhoneNumber, _T("192.168.1.254"));//_T("124.227.190.253"));//g_LangCfg.GetVpnServerAddr());
rasentry.dwfNetProtocols = RASNP_Ip;
rasentry.dwFramingProtocol = RASFP_Ppp;
_tcscpy(rasentry.szDeviceType, RASDT_Vpn);
_tcscpy(rasentry.szDeviceName, m_sszVPNDeviceNamePPTP);
#ifndef _WIN32_WCE
rasentry.dwDialMode = RASEDM_DialAll;
rasentry.dwType = RASET_Vpn;
#endif
TCHAR szrasentryname[RAS_MaxEntryName + 1];
_tcscpy(szrasentryname, g_LangCfg.GetVpnEntryName());
DWORD dwResult = 
RasSetEntryProperties(NULL, szrasentryname, &rasentry, sizeof(RASENTRY), NULL, 0);
if (0 != dwResult)
{
RM_LOG(LOG_ERROR, _T("创建vpn失败!"));
return FALSE;
}

// 拨号
RASDIALPARAMS dialParams;
ZeroMemory(&dialParams, sizeof(RASDIALPARAMS));
dialParams.dwSize = sizeof(RASDIALPARAMS);
_tcscpy(dialParams.szEntryName, g_LangCfg.GetVpnEntryName());
_tcscpy(dialParams.szUserName, _T("hwj"));//g_LangCfg.GetVpnUserName());
_tcscpy(dialParams.szPassword, _T("stanley"));//g_LangCfg.GetVpnPassword());
dwResult = RasDial(NULL, NULL, &dialParams, 0, NULL, &m_hRasVPNConn);
if (0 != dwResult)
{
RM_LOG(LOG_ERROR, _T("vpn拨号失败!"));
return FALSE;  
}

// 获取vpn本地ip地址
RASPPPIP rasPPPIP;
ZeroMemory(&rasPPPIP, sizeof(rasPPPIP));
rasPPPIP.dwSize = sizeof(rasPPPIP);
DWORD dwSize = sizeof(rasPPPIP);


dwResult = 
RasGetProjectionInfo(m_hRasVPNConn, RASP_PppIp, (LPVOID)&rasPPPIP, &dwSize);
if (0 != dwResult)
{
RM_LOG(LOG_ERROR, _T("获取vpn本地ip地址失败!"));
return FALSE;
}

// 输出
strVPNLocalIPAddr = rasPPPIP.szIpAddress;
return TRUE;



运行结果:
同样的代码,在PC机上成功拨号,在WINCE上总是等了大概30秒左右返回ERROR_PORT_DISCONNECTED

补充:
在PC机上执行程序,使用Wireshark抓包工具抓包,包序列为:
48930.996007192.168.1.37192.168.1.254TCP7840 > pptp [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=3 TSV=0 TSER=0 SACK_PERM=1
49030.997215192.168.1.254192.168.1.37TCPpptp > 7840 [SYN, ACK] Seq=0 Ack=1 Win=16384 Len=0 MSS=1460 WS=0 TSV=0 TSER=0 SACK_PERM=1
49130.997265192.168.1.37192.168.1.254PPTPStart-Control-Connection-Request
49230.997671192.168.1.254192.168.1.37PPTPStart-Control-Connection-Reply
49330.997698192.168.1.37192.168.1.254PPTPOutgoing-Call-Request
49430.999517192.168.1.254192.168.1.37PPTPOutgoing-Call-Reply
49531.002901192.168.1.37192.168.1.254PPTPSet-Link-Info
而在WINCE上执行程序(wince使用USB线连接电脑),使用Wireshark抓包工具抓包,包序列为:
85647.749191192.168.1.37192.168.1.254TCP7879 > pptp [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=3 TSV=0 TSER=0 SACK_PERM=1
85747.750391192.168.1.254192.168.1.37TCPpptp > 7879 [SYN, ACK] Seq=0 Ack=1 Win=16384 Len=0 MSS=1460 WS=0 TSV=0 TSER=0 SACK_PERM=1
85847.750418192.168.1.37192.168.1.254TCP7879 > pptp [ACK] Seq=1 Ack=1 Win=372296 Len=0 TSV=1018241 TSER=0
85947.750700192.168.1.37192.168.1.254PPTPStart-Control-Connection-Request
86047.750998192.168.1.254192.168.1.37PPTPStart-Control-Connection-Reply
86147.754291192.168.1.37192.168.1.254PPTPOutgoing-Call-Request
86247.755887192.168.1.254192.168.1.37PPTPOutgoing-Call-Reply
86347.904897192.168.1.37192.168.1.254TCP7879 > pptp [ACK] Seq=325 Ack=189 Win=372112 Len=0 TSV=1018243 TSER=6067348  【在这里出现这个包很怪!!!!】
446977.771233192.168.1.37192.168.1.254PPTPCall-Clear-Request
447077.771616192.168.1.254192.168.1.37PPTPCall-Disconnect-Notify
447177.775547192.168.1.37192.168.1.254PPTPStop-Control-Connection-Request
447277.775799192.168.1.254192.168.1.37PPTPStop-Control-Connection-Reply
447377.775865192.168.1.254192.168.1.37TCPpptp > 7879 [FIN, ACK] Seq=353 Ack=357 Win=65179 Len=0 TSV=6067648 TSER=1018541
...异常断开了




[解决办法]
这问题解决了吗?

热点排行