socket方式实现网络通信

上传人:第*** 文档编号:30581016 上传时间:2018-01-30 格式:DOC 页数:7 大小:42KB
返回 下载 相关 举报
socket方式实现网络通信_第1页
第1页 / 共7页
socket方式实现网络通信_第2页
第2页 / 共7页
socket方式实现网络通信_第3页
第3页 / 共7页
socket方式实现网络通信_第4页
第4页 / 共7页
socket方式实现网络通信_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《socket方式实现网络通信》由会员分享,可在线阅读,更多相关《socket方式实现网络通信(7页珍藏版)》请在金锄头文库上搜索。

1、下边用的是 socket 方式实现网络通信,如果要实现 http 通信,需要在第五步的时候,先发送 http 的一些头文件。说明此次通信是 http,然后再发送具体的数据就行啦。mtk 平台手机基于 gprs 连接 pc 的实现方式( tcp 通讯方式)1.建立 data account(上网帐号)MMI 层发送 PRT_MMI_PS_SET_GPRS_DATA_ACCOUNT_REQ 消息到 L4C 层,在消息中设定 data account 的 id(1-10),自定义名称,APN(cmnet, cmwap),用户名,密码,DNS 等消息。/* DTCNTGPRSSetAccountReq

2、() ? */2.创建 socket手机上用 socket 建立连接和 PC 用 socket 建立连接的原理是一样的,只是 API 函数不一样。kal_int8 soc_create(kal_uint8 domain, socket_type_enum type, kal_uint8 protocol, module_type mod_id, kal_uint32 nwk_account_id);3.设置 socket 的异步非阻塞模式kal_int8 soc_setsockopt(kal_int8 s, kal_uint16 option,kal_uint8 *val, kal_uint8

3、 val_size);这里的第二个参数 option 设置为 SOC_NBIO(socket 非阻塞模式)kal_int8 soc_setsockopt(kal_int8 s, kal_uint16 option,kal_uint8 *val, kal_uint8 val_size);这里的第二个参数 option 设置为 SOC_ASYNC(异步 I/O)4.建立连接kal_int8 soc_connect(kal_int8 s, sockaddr_struct *addr);5.发送数据标记,发送头文件kal_int32 soc_send(kal_int8 s, kal_uint8 *bu

4、f, kal_int32 len, kal_uint8 flags);6.读取数据kal_int32 soc_recv(kal_int8 s, kal_uint8 *buf, kal_int32 len, kal_uint8 flags);7.关闭连接kal_int8 soc_close(kal_int8 s);一、MTK 平台 Socket 联网过程熟悉 PC 机编程的人都知道,Socket 编程接口分两套:TCP 和 UDP;TCP 和UDP 中又有服务器端和客户端的概念,这里讲的是 TCP 的客户端编程接口。MTK 平台中 Socket 创建步骤:1、soc_create() 创建 So

5、cket;2、soc_setsockopt 设置 Socket 为非阻塞模式;3、soc_setsockopt 设置 Socket 选项为连接,读,写,关闭;不清楚为什么要连续设置两次,如有高人路过,请指点;4、如果是 CMNET 联网并且请求中用到了英文域名还需要解析域名soc_gethostbyname,除非使用 ip 作为域名,解析出来的 IP 作为我们建立连接的目标 IP;如果是 CMWAP 联网,直接跳到第 5 步,直接连接移动或联通的网关:10.0.0.172:80;5、soc_connect 与服务器建立连接;6、soc_send 发送请求;7、soc_recv 接收服务器返回的

6、数据;8、soc_close 关闭 Socket;9、如果需要关闭数据账户 soc_close_nwk_account二、CMNET,CMWAP 方式下的 HTTP 请求内容格式HTTP 请求格式:GET 方法MTK 模拟器中 wap 浏览器发送的请求内容“GET /go_13596557 HTTP/1.1Host: User-Agent: SQH_D480B_01/LB19504/WAP2.0 ProfileAccept: application/vnd.wap.wmlc, * /(想当长,省去后面部分)Accept-Charset: utf-8, utf-16, iso-8859-1, i

7、so-10646-ucs-2, GB2312, windows-1252, us-asciiAccept-Language: zh-tw, zh-cn, enCookie: JSESSIONID=aAQP0FIXp3z7Connection: Keep-Alive“POST 方法对一些需要向服务器传入参数的请求,按名称搜索等请求。还以空中网天气查询为例,之中的其他城市天气查询,输入其他城市名称或电话区号查询:“POST /weather/search.jsp?setcity=1 HTTP/1.1Host: User-Agent: SQH_D480B_01/LB19504/WAP2.0 Prof

8、ileAccept: application/vnd.wap.wmlc, */* /(想当长,省去后面部分)Accept-Charset: utf-8, utf-16, iso-8859-1, iso-10646-ucs-2, GB2312, windows-1252, us-asciiAccept-Language: zh-tw, zh-cn, enContent-Type: application/x-www-form-urlencoded; charset=utf-8Cookie: KONG_ACCESS=AWYZhg=; JSESSIONID=a91MDc6qoMYfConnectio

9、n: Keep-AliveContent-Length: 46/get 方法没有这一项/传给服务器 46 字节长的数据(参数)“当然如果是 CMWAP 联网方式也要和上述的 GET 方法一样设置 Host 和 X-Online-Host 项,Host:10.0.0.172X-Online-Host: 以上的内容,可以在调试状态下运行模拟器的 wap 浏览器,在 soc_send 方法处插入断点观察。HTTP 的其他方法,由于在应用中没有用到,在这里不做介绍。三、CMNET,CMWAP 连接差别1、GPRS 账户 :与 pc 机上的 socket 客户端接口不同,手机客户端在soc_create

10、,soc_gethostbyname 接口中都多了参数 nwt_acount_id,只的是一般在“网络服务”-“数据账户”-“GPRS”下的 GPRS 数据账户 id,一般起始的一个账户 id 是 10,往下递增 1,在建立连接过程中,如果是CMWAP 方式联网,soc_create,soc_gethostbyname 接口就要设置接入点为 CMWAP 的账户 id,CMNET 就要设置接入点为 CMNET 的账户。2、目标服务器:还以空中网的天气服务为例,CMNET 情况下,soc_connect 需要连接”221.179.172.2”这个 ip,如果请求的 url 为”http:/ ,还需

11、要调用soc_gethostbyname 接口去解析域名;如果是 CMWAP 方式联网,soc_connect 只需要连接移动或联动的网关”10.0.0.172:80”。3、HTTP 请求内容格式(或称报文):如第二节所述。四、SIM1 还是 SIM2 联网SIM1 还是 SIM2 联网,MTK 平台是通过创建 socket 时传入的nwt_acount_id 区分的,如果是 SIM1 上网,账号就是指的是一般在“网络服务”-“数据账户”-“GPRS”下的对应的 GPRS 数据账户 id;如果是 SIM2,通过在四字节的账户 id 其他字节设置掩码来区分。设置接口比如 07B 平台的alway

12、s_ask_encode_data_account_id,6235_08A 的cbm_encode_data_account_id 接口。不同平台可能略有差别。五、联通卡还是移动卡?参考其他 Socket 联网代码中有的以接入点是否为”uniwap”来判断是不是联通的代理上网,但是通过实验,即使在联通卡时连接移动的”cmwap” 账户,也是可以正常联网的。不知道设计“GPRS 数据账户”的最初意图是什么?通过apn 来区分同一内部 ip 地址网关不同的公网 ip 吗?如有高人路过,请指点 ;六、HTTP1.1 与 Transfer-Encoding 为 chunked 的编码方式发送一个请求后

13、,如果服务器返回的消息头内容包括“Transfer-Encoding: chunked”那么他的传输编码为“chunked”类型。这种传输类型的数据体内容格式是这样:16 进制数字字符串 1 到 4 个字节 lenrnlen 长的数据体rn16 进制数字字符串 1 到 4 个字节 lenrnlen 长的数据体rn16 进制数字字符串 1 到 4 个字节 len = 0rnrn其中,长度 len 是 16 进制的数字,表示本段数据体的长度(字节数),回车换行后,就是这一段数据真实内容,这就是一段数据体的格式,一段接一段;直到数据体长度为 0 的数据段出现,紧接着两个回车换行,标识本次请求的数据均

14、已接收完毕。不过 socket 可以根据 soc_recv 返回值等于 0 来判断接收数据结束。如果收到的是这个编码类型的内容,需要对接收到的数据进行处理。七、MTK 平台的 S8 类型的误导MTK 平台定义的两个数据类型 U8 和 S8,一看名称我们可能会以为是unsigned char 和 signed char,但事实并非如此,typedef char S8;typedef unsigned char U8;MTK 平台的 char 默认也是 unsigned char 类型的,soc_gethostbyname 返回值类型是 kal_int8(typedef signed char k

15、al_int8;),如果 S8 或平台的 char 类型是有符号的字符型,那么,kal_int8 和 S8 应该是等价的,但用 S8 类型变量作为 soc_gethostbyname的返回值时,经常返回 254 导致域名不会被正常解析,其实应该返回SOC_WOULDBLOCK(-2),应该是阻塞码,将 soc_gethostbyname 返回值类型改为 kal_int8 后,就能正常处理域名解析了。这证明平台的 S8 类型及char 类型默认是无符号的。八、不理解的链接错误?在添加连接超时功能时用到了 gui_start_timer 和 gui_cancel_timer时,没有加入#inclu

16、de gui.h时,出现以下链接错误:Error: L6286E: Value(0x818153e) out of range(-0x400000 - 0x3fffff) for relocation #13 (wrt symbol gui_cancel_timer) in Socket.obj(i. SocDinit)加上#include gui.h时,就没有这个问题,如果程序找不到这个符号,应该是个编译错误,在此为什么是个链接错误。MTK 使用 Socket 来实现 HTTP 的请求。 MTK 平台中 Socket 创建步骤: 1、soc_create() 创建 Socket,成功后将返回一个 socket_id 供下面的函数使用,成功运行在手机上的效果是

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 外语文库 > 英语学习

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号