今天,测试了在手机上通过GPRS连接服务器,这个问题搞了我几天,今天终于算连上去了,想想其中的过程,还真是百感交集(怎么感觉有点像在写作文! -_-!)。
在电脑上,socket中connect是可以直接就连上服务器的,但是这个思路在手机下就不行了,手机中的系统不似电脑一样,当你有联接请求的时候,会自动帮你启动网络功能。在手机中你必须自已打开联接管理,自已选择 对应的接入方式(CMWAP/CMNET),当把这些设好之后,调用 ConnMgrEstablishConnectionSync 打开网络,然后你的socket才能够工作。在mobile中,打开的联接操作如下:
GUID IID_DestNetWAP = { 0x7022e968, 0x5a97, 0x4051, 0xbc, 0x1c, 0xc5, 0x78, 0xe2, 0xfb, 0xa5, 0xd9};
CONNMGR_CONNECTIONINFO pConnInfo;
memset(&pConnInfo, 0, sizeof(CONNMGR_CONNECTIONINFO));
pConnInfo.cbSize=sizeof(CONNMGR_CONNECTIONINFO);
pConnInfo.dwParams=CONNMGR_PARAM_GUIDDESTNET;
pConnInfo.dwFlags=CONNMGR_FLAG_PROXY_WAP | CONNMGR_FLAG_PROXY_HTTP | CONNMGR_FLAG_PROXY_SOCKS4 | CONNMGR_FLAG_PROXY_SOCKS5;
pConnInfo.dwPriority=CONNMGR_PRIORITY_USERINTERACTIVE;
pConnInfo.bExclusive=FALSE;
pConnInfo.bDisabled=FALSE;
pConnInfo.hWnd=m_hWnd;
pConnInfo.guidDestNet= IID_DestNetWAP;
DWORD pdwStatus=0;
HRESULT hr=ConnMgrEstablishConnectionSync(&pConnInfo, &m_wapHandle, 10000, &pdwStatus);
if(hr == S_OK)
{
return true;
}
else
{
return false;
}
当然,你写的时候,可以查看对应的MSDN文档。不过值得一提的是,我包含了里面的头文件和库文件:
#define INITGUID
#include <connmgr.h>
在工程中添加cellcore.lib,编译的时候,还是提示我IID_DestNetWAP无法解释的外部符号(真是呕吐!!)。
后来查找了一下,发现要添加GUID IID_DestNetWAP = { 0x7022e968, 0x5a97, 0x4051, 0xbc, 0x1c, 0xc5, 0x78, 0xe2, 0xfb, 0xa5, 0xd9};在这儿指出来,希望对有像我遇到相同问题的人有个帮助。
打开了手机联接之后,你就可以像在电脑上一样,操控你的socket了(当然,手机中的socket还是与电脑上有很些不同的)。
最后附上截获的中国移动最呕心的拦截页面的数据格式,希望对有后台自动处理这个拦截页面的人能提供点帮助!:)
HTTP/1.1 200 OK, Success
Content-length: 917
Content-Type: text/vnd.wap.wml;charset=UTF-8
Date: Sat, 29 Sep 2007 06:54:38 GMT
Pragma: no-cache
Server: WebLogic Server 8.1 SP3 Tue Jun 29 23:11:19 PDT 2004 404973 with CRs:
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"><wml><head><meta http-equiv="Cache-Control" content="max-age=0" forua="true" /><meta http-equiv="Cache-Control" content="no-cache" forua="true" /><meta http-equiv="Cache-Control" content="must-revalidate" forua="true" /></head><card title=""><p>中国移动提醒您:继续浏览网页将产生GPRS通信费,确认请点击<br/><a href='/?t=78781'>/</a><br/>您可以选择取消本提醒服务,取消后再登陆本网站将不会收到该提示页面。<br/> <a href="http://218.200.249.249/usercancelservlet?fr=0&ou=%2F">取消提醒</a> <br/>如需查询GPRS通信费标准,请拨打10086,包月客户仍按原套餐资费标准收费。</p></card></wml>
在电脑上,socket中connect是可以直接就连上服务器的,但是这个思路在手机下就不行了,手机中的系统不似电脑一样,当你有联接请求的时候,会自动帮你启动网络功能。在手机中你必须自已打开联接管理,自已选择 对应的接入方式(CMWAP/CMNET),当把这些设好之后,调用 ConnMgrEstablishConnectionSync 打开网络,然后你的socket才能够工作。在mobile中,打开的联接操作如下:
GUID IID_DestNetWAP = { 0x7022e968, 0x5a97, 0x4051, 0xbc, 0x1c, 0xc5, 0x78, 0xe2, 0xfb, 0xa5, 0xd9};
CONNMGR_CONNECTIONINFO pConnInfo;
memset(&pConnInfo, 0, sizeof(CONNMGR_CONNECTIONINFO));
pConnInfo.cbSize=sizeof(CONNMGR_CONNECTIONINFO);
pConnInfo.dwParams=CONNMGR_PARAM_GUIDDESTNET;
pConnInfo.dwFlags=CONNMGR_FLAG_PROXY_WAP | CONNMGR_FLAG_PROXY_HTTP | CONNMGR_FLAG_PROXY_SOCKS4 | CONNMGR_FLAG_PROXY_SOCKS5;
pConnInfo.dwPriority=CONNMGR_PRIORITY_USERINTERACTIVE;
pConnInfo.bExclusive=FALSE;
pConnInfo.bDisabled=FALSE;
pConnInfo.hWnd=m_hWnd;
pConnInfo.guidDestNet= IID_DestNetWAP;
DWORD pdwStatus=0;
HRESULT hr=ConnMgrEstablishConnectionSync(&pConnInfo, &m_wapHandle, 10000, &pdwStatus);
if(hr == S_OK)
{
return true;
}
else
{
return false;
}
当然,你写的时候,可以查看对应的MSDN文档。不过值得一提的是,我包含了里面的头文件和库文件:
#define INITGUID
#include <connmgr.h>
在工程中添加cellcore.lib,编译的时候,还是提示我IID_DestNetWAP无法解释的外部符号(真是呕吐!!)。
后来查找了一下,发现要添加GUID IID_DestNetWAP = { 0x7022e968, 0x5a97, 0x4051, 0xbc, 0x1c, 0xc5, 0x78, 0xe2, 0xfb, 0xa5, 0xd9};在这儿指出来,希望对有像我遇到相同问题的人有个帮助。
打开了手机联接之后,你就可以像在电脑上一样,操控你的socket了(当然,手机中的socket还是与电脑上有很些不同的)。
最后附上截获的中国移动最呕心的拦截页面的数据格式,希望对有后台自动处理这个拦截页面的人能提供点帮助!:)
HTTP/1.1 200 OK, Success
Content-length: 917
Content-Type: text/vnd.wap.wml;charset=UTF-8
Date: Sat, 29 Sep 2007 06:54:38 GMT
Pragma: no-cache
Server: WebLogic Server 8.1 SP3 Tue Jun 29 23:11:19 PDT 2004 404973 with CRs:
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"><wml><head><meta http-equiv="Cache-Control" content="max-age=0" forua="true" /><meta http-equiv="Cache-Control" content="no-cache" forua="true" /><meta http-equiv="Cache-Control" content="must-revalidate" forua="true" /></head><card title=""><p>中国移动提醒您:继续浏览网页将产生GPRS通信费,确认请点击<br/><a href='/?t=78781'>/</a><br/>您可以选择取消本提醒服务,取消后再登陆本网站将不会收到该提示页面。<br/> <a href="http://218.200.249.249/usercancelservlet?fr=0&ou=%2F">取消提醒</a> <br/>如需查询GPRS通信费标准,请拨打10086,包月客户仍按原套餐资费标准收费。</p></card></wml>