使用GPRS的cmwap接入点实现网络通讯1-----建立连接
关于无线接入方式的比较请见http://www.cnblogs.com/yoyolion/archive/2007/05/26/760807.html
cmwap作为费用低廉的无线上网方式,具有很大的应用价值。本文讨论了使用GPRS的cmwap接入点实现网络通讯,完成自定义数据的收发。
环境与平台:
服务器拥有一个公网ip,设为100.200.300.400 ,端口1000(为尽量简化,不使用域名,应该没有区别)
测试平台:服务器windows 2000 server,客户端pocket pc 2003 sencond edition(windows ce.net 4.2),软件以vc++2005开发(mfc8.0)
使用Pocket IE请求访问http:// 100.200.300.400:1000时,服务器端收到的数据如下
GET / HTTP/1.1
Host: 100.200.300.400: 1000
Accept: */*, text/x-vcard, text/x-vcalendar, image/gif, image/vnd.wap.wbmp
Accept-Language: zh-cn
UA-OS: Windows CE (Pocket PC) - Version 4.21
UA-color: color16
UA-pixels: 240x320
UA-CPU: Intel(R) PXA272
UA-Voice: TRUE
UA-Language: JavaScript
Accept-Encoding: gzip, deflate
Content-length: 0
Via: WTP/1.1 BJBJ-P-GW06-WAP.bj.monternet.com (Nokia WAP Gateway 4.0/CD3/4.1.79)
X-Forwarded-For: 10.12.239.87
X-Source-ID: GGSN
X-Nokia-CONNECTION_MODE: TCP
X-Up-Bearer-Type: GPRS
X-Nokia-gateway-id: NWG/4.1/Build04
Connection: close
可以看到它是普通的HTTP协议请求Request。
以下是客户端向100.200.300.400:1000发送一个请求的代码(为求清晰,省略了错误处理)
SOCKET m_socket;
socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//TCP套接字
struct sockaddr_in m_SeverAddr;//服务器地址
m_SeverAddr.sin_family = AF_INET;
m_SeverAddr.sin_addr.s_addr=inet_addr(“10.0.0.172”);//cmwap代理服务器ip
m_SeverAddr.sin_port = htons(80);//端口
connect(m_socket, (sockaddr *)&m_SeverAddr, sizeof(m_SeverAddr));
char request[100];
//下面是HTTP请求,注意一定是以空行结束(\r\n\r\n),具体参考HTTP协议
sprintf(request, "%s", "GET http://100.200.300.400:1000 HTTP/1.1\r\n\r\n");
send(m_socket, request, len, 0);//发送请求
connect是和cmwap代理服务器建立连接,再通过代理服务器完成与服务器的通信,成功执行send后(GET http://100.200.300.400:1000 HTTP/1.1),服务器很快就收到了请求包,如下:
GET / HTTP/1.1
Host: 100.200.300.400:1000
Content-length: 0
Via: WTP/1.1 BJBJ-P-GW13-WAP.bj.monternet.com (Nokia WAP Gateway 4.0/CD3/4.1.79)
X-Forwarded-For: 10.12.104.128
X-Source-ID: GGSN
X-Nokia-CONNECTION_MODE: TCP
X-Up-Bearer-Type: GPRS
X-Nokia-gateway-id: NWG/4.1/Build04
accept: */*
Connection: close
可以看到cmwap代理服务器为请求GET http://100.200.300.400:1000 HTTP/1.1加上了一些头信息,主要是网关地址BJBJ-P-GW13-WAP.bj.monternet.com,这个应该是称动服务器的URL。
如果是在重置或切换网络后第一次使用GPRS,可能会收到cmwap代理服务器发出的提示:
HTTP/1.1 200 OK, Success
Content-length: 725
Content-Type: text/vnd.wap.wml;charset=UTF-8
Date: Sat, 26 May 2007 02:40:06 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>中国移动通信提醒您:<br/>您正在使用手机上网业务,若继续浏览网页,会产生GPRS通信费,具体资费标准请垂询10086热线或访问www.sh.chinamobile.com。对包月客户仍按套餐资费标准收费。<br/>=继续访问请点击=<br/><a href='100.200.300.400:1000/?t=06158'>100.200.300.400:1000</a></p></card></wml>
我使用的是上海移动的神州行cmwap包月卡,这个提示信息是上海移动提醒客户端确认是否要进行internet访问的,可能是为了避免客户无意中使用GPRS而导致产生流量费用。该提示仅在重置或切换网络后第一次使用GPRS出现,后面再连接等不会出现。这个提示应该是和具体的网络提供商有关,使用其它省的包月卡可能没有这个提示。
具体处理时可以先判断一下是否有该提示,如果有,再次调用send(m_socket, request, len, 0)发送请求即可。
这样,通过connet到cmwap代理服务器,再发出一条Request,就实现了建立与目标服务器100.200.300.400:1000的连接,当然这种连接是间接的。