blog.TangGaowei.com

[源码]在GPRS CMWAP网络中,用Socket向Baidu发送HTTP请求

作者 传说一梦 写于 2008-05-01  | 644 次浏览 | 分类 » 软件开发 |

前言:

想做一个能发送饭否( fanfou.com ) 的手机客户端。开始想自己编译一个手机片的 cURL 使用,后来又打算自己写 HTTP 协议代码。最后决定用 Socket 来实现 HTTP 协议。在用 Socket 向 Baidu 正确地发送一条 HTTP GET 请求,并返回成功信息后,在此做一总结。

总结:

中国移动的 GPRS 有 CMNET 和 CMWAP 两种网络连接方式。CMNET 直接连接到 Internet,就跟电脑通过路由器连接电信宽带一样。CMWAP 则只能通过中国移动提供的代理服务器 (10.0.0.172:80 或 10.0.0.172:9201 等) 连接 Internet。

要通过 GPRS 连接 Internet,首先要“初始化网络连接”。Socket 不会自动“初始化网络连接”。在使用前,要进行网络连接的初始化。将“浏览器”打开,任意连接成功一个网站,也能完成“初始化网络连接”操作。

HTTP 头必须以两个 CRLF 结束,如 "GET http://www.baidu.com HTTP/1.1\r\n\r\n" 。否则,服务器将不予响应。

在 HTTP 头中包含 "Connection:close" 项时,表示终止连接。客户端发送终止连接的 HTTP 头后,最多只能再收到一条从服务器返回的响应。一条响应可分多次接收( Recv ),一次接收一部分。

有文章说在发送 HTTP GET 请求前,先要向代理服务器发送 CONNECT 请求,如 "CONNECT 10.0.0.172:80 HTTP/1.1\r\n\r\n" 或 "CONNECT www.baidu.com:80 HTTP/1.1\r\n\r\n"。但是,我使用的GPRS,在 Socket Connet 后,是直接发送 HTTP GET 请求的。如果正确,返回类似 "HTTP/1.1 200 OK, Success …" 的信息。信息包括 HTTP 头和 HTTP 体。HTTP 体包含了请求地址的 HTML 源码,长度在 HTTP 头里有定义。

Socket 的 connect、send、recv 等都是阻塞式方法。即在这些方法返回前,进程被阻塞,不能执行其它操作。使用 Socket 的 Select 方法可实现非阻塞( 可能要配合多线程使用 )。

源码下载:GPRSSocket.zip

源码简介:

本代码实现“网络连接的初始化”、“连接( 中国移动的 )代理服务器”、“向代理服务器发送 HTTP GET 请求”和“接收返回信息”。

源码中使用到的要 C++ 类:

  • CConnectManager - 由 chrys 创建的 C++ 类,用于“初始化网络连接”。
  • Socket - 由 TangGaowei.com 创建的 C++ 类,用于封闭 Socket 的 connect、send、recv 等方法。

( 注:如果连接 10.0.0.172:80 代理不行,可改为 10.0.0.172:9201 重试 )

运行环境:

  • 多普达 586w (Windows Mobile 5.0 Smartphone)
  • 浙江移动 GPRS (20元包月) (已配置好网络连接)

开发环境:

  • Windows XP Home
  • Microsoft ActiveSync 4.5
  • Microsoft Visual Studio 2005
  • Windows Mobile 5.0 Smartphone SDK
  • Windows Mobile 5.0 Emulator Images for Smartphone - CHS
[ 标签: cmwap, GPRS, http, socket ]
[ 固定链接:http://blog.tanggaowei.com/2008/05/gprs-cmwapsocketbaiduhttp.html ]

发表评论


点击图片可以听验证码

订阅

 

手机访问

http://blog.tanggaowei.com/wap/

Google