资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
MTK socket 小结 1移动互联网也炒了好几年了,现在开发手机也好,单独做应用也好,都会涉及到网络这一块。MTK 提供了网络功能,在 GPRS 上封装了 socket 功能。MTK 上的 socket 其实与linux 上的有些相似,其实说到 socket 编程,只要封装实现了 socket,那么基本上就要实现 socket 那些接口。 先来简单的介绍一下 socket,socket 编程是介于 传输层 和 应用层之间,可以简单的理解为 socket 就是封装了传输层的 TCP 和 UDP 协议,使用户不用去封装一个 TCP 或者 UDP 包,开发使用网络通讯就更加简单了。如果拿一个寄信的过程来比喻一个网络通信过程。socket 就像给你准备好了信纸和信封,只要把你想写的内容写到信纸上,然后信封上写上地址,就可以邮寄了。信封里的内容就像 应用层协议,具体怎么写由应用之间来确定,比如说,用英文写(http 协议) ,懂英文的能看懂(http 服务器或者客户端能识别) 。 有时候老有人问,用 MTK 怎么去请求一个网页,MTK 已经准备好了 socket(信纸) ,就看要写什么样的语言能让收信方看懂。请求网页就是一个 http 请求,也就是(socket)信纸上写上 http 请求,服务器就能返回相应答复。具体说 http 请求怎么写,那就要去研究 http 协议,就像要想和美国人通信,要学习英文一样 手机通信,还有一个需要提到的是 APN (Access Point Name)接入点,只用设置正确的APN,才能上网。一开始没有弄明白 MTK 的 APN,搞出很多问题,在北京做好的DEMO,把手机拿到深圳去,就发现不能用 GRPS,网络连接一直失败,尝试了 N 多种方法,换 SIM 卡,换本地手机等等, (扯远了) 。以中国移动为例,介入方式有两种cmwap,cmnet。cmwap 访问的是内网,ip 地址是 10 开头,可以理解为所有的手机都是在一个大的局域网里,要访问 wap 网站,需要通过 wap 网关,移动的好像是(10.0.0.172:80) ,也就是说,所有的 wap 网站访问,都要通过这个代理。cmnet 就是全网模式,也就是设置了 cmnet,就像接入了互联网,直接可以访问互联网。对于中国电信,不是很了解,原来去听 brew 开发讲座的时候,应约记得电信只有一种内往模式。要访问外部服务器,就得去电信开通业务。如果是开发阶段,可以暂时把手机设置成 card-card 模式,这样就相当于移动的 cmnet 了。MTK socket 小结 2今天主要讲一下 MTK socket 基本接口。MTK socket 主要是基于 Berkeley sockets,用起来也就大同下异。MTK socket 主要有三种模式:block(阻塞) ,non-block(非阻塞),Asynchronous(异步),组合方式 也只有三种 1 block ,2 non-block,3 non-block + Asynchronous。block 模式下,调用相应的函数(接受或者发送数据) ,如果这个函数动作没有完成(没有发送或者接受完成),那么函数就不会反回,那么调用的整个 task,就会阻塞,进行不了任何动作。如果在 MMI MOD 里面直接用这个,那是很危险的,会出现手机没有响应这种假死现象,所以几乎不用这个模式。non-block 模式下,调用相应的函数,可能返回 ok 或者 block,大部分情况下返回 block,表示数据还没有处理完毕,但是函数会立即返回。但是什么时候表示数据处理完成呢,这也是一个比较头疼的事情。这个时候要配合 select 函数来一起使用,这样就需要自己轮询去查询相应的 socket 是否可以使用了。一般也不用,效率比较低。 non-block + Asynchronous 模式:这个模式推荐使用,可以编成工作中几乎就用这种方式,non-block,就不会阻塞,不会让应用看起来假死,Asynchronous 模式,那么当使用函数返回 block 时,app 只要注册相应的回调函数,当数据处理完毕了,就会收到相应的通知,不用自己去轮询,效率也就高了。 MTK socket 接口声明都在头文件 soc_api.h,接口名字都以 soc_ 开头。 1 soc_create 创建一个 socket /* 创建一个 socket* domain: 协议,现在只支持 SOC_PF_INET* type : 该 domain 下的类型,现在有 SOC_SOCK_STREAM(TCP),SOC_SOCK_DGRAM(UDP),SOC_SOCK_SMS,SOC_SOCK_RAW* protocol: 协议类型,除了 type 为 SOC_SOCK_RAW,其他都为 0* mod_id: 当前模块 ID,主要用于接受消息* nwk_account_id:apn 接入点*/kal_int8 soc_create(kal_uint8 domain,socket_type_enum type,kal_uint8 protocol,module_type mod_id,kal_uint32 nwk_account_id); 就说了一个函数,又没时间了。 。 。MTK socket 小结 3在 MTK socket 小结 2 说了一个 socket create 函数,不知道今天能说几个,create 了一个socket,就像打开了一个文件,可以对其进行操作,当然操作前要稍微进行一些设置。/关闭 socket 与 soc_create 成对使用 kal_int8 soc_close(kal_int8 s)/ 绑定一个 socket 到 一个指定的 ip 地址 和 端口。主要用于服务器短开发/ 一般 ip 地址全 0,端口就是想要绑定的端口/ 在实际开发中,几乎不会用到,除非想用手机做服务器, hoho。 kal_int8 soc_bind(kal_int8 s, sockaddr_struct *addr);/ 绑定完 socket 之后,就可以监听这个 ip 的端口/ 这个也几乎不会用,也是用于服务器端。/ backlog 同时能连接的 socket 个数 kal_int8 soc_listen(kal_int8 s, kal_uint8 backlog);/ 当有 socket 连接到该机时, accept 就可以获得该连接,同样也是用于服务器端 / addr 可以获得连接过来的 socket 地址/ 返回一个新的 socket kal_int8 soc_accept(kal_int8 s, sockaddr_struct *addr);/ 连接到一个指定 ip 地址的服务器/ 这个函数很常用,要想联网,就的通过 addr 指定 ip 地址和端口 / 根据不同的模式 (block, none block,asynchronous,这个函数会稍微不同/ 如果是 block,那么整个 task 就被 block,直到 connect 成功或者失败或者超时/ 这个如果在 MMI task 里面,后果就会比较严重(界面不动,无响应)/ 所以最常用 none block + asynchronous, 几乎马上返回,成功或失败或者SOC_WOULDBLOCK/ 大部情况下返回 SOC_WOULDBLOCK,那么就等待消息,由消息得知到底成功 or 失败。/ addr 就是要连接的 ip 地址和端口 kal_int8 soc_connect(kal_int8 s, sockaddr_struct *addr)/ 向指定的 ip 地址和端口发送数据/ buf 和 len 分别是要发送的内容和长度 / flag 暂时没有使用 设置为 0/ addr 指定要发送到的 ip 地址和端口 / 说明:如果 create socket 的时候是 TCP,那么还是需要先 connect 到 服务器,再调用该函数/ 这与 berkeley 的 socket 规范有点区别 kal_int32 soc_sendto(kal_int8 s,void *buf,kal_int32 len,kal_uint8 flags,sockaddr_struct *addr);/ 向已经 connect 的上的服务器发送数据/ buf 和 len,是要发送的内容和长度/ flags 暂时不使用/ 这个也是很常用的, 连接完毕之后,就可以发送数据了 / 比如要请求一个网页,那么就发送一个 HTTP 请求就可以了 / 跟 soc_connect 一样,最找在 模式 3 下使用kal_int32 soc_send(kal_int8 s,void *buf,kal_int32 len,kal_uint8 flags);/ 从指定地址接收数据/ buf 读取数据的 buf,len 读取数据 buf 的最大长度/ flags 暂时无用,设置为 0/ 返回实际读取的数据长度kal_int32 soc_recvfrom(kal_int8 s,void *buf,kal_int32 len,kal_uint8 flags,sockaddr_struct *fromaddr);/ 从已经连接上的服务器上接收数据/ 同样最好在模式 3 下使用,当收到消息有可读数据时, / 可以调用该函数,从 socket 里面读取数据 / 参数同上 kal_int32 soc_recv(kal_int8 s,void *buf,kal_int32 len,kal_uint8 flags);/ 设置 socket 的参数,当创建好 socket 之后,就可以设置了/ 模式 3 none block + asynchronous 就是通过这个函数设置定的kal_int8 soc_setsockopt(kal_int8 s,kal_uint32 option,void *val,kal_uint8 val_size);/ 比如S8 val = 0, ret = 0;val = KAL_TRUE;/ 设置为 none block 模式,默认为 block 模式ret = soc_setsockopt(soc_id , SOC_NBIO, &val, sizeof(val);/ 设置为异步模式,并且监听消息,这里设置了 / SOC_READ 表示有数据可读,也就是可以调用 soc_recv 读取/ SOC_WRITE 表示可以写,也就是可以通过 soc_send 来发送数据/ SOC_CONNECT 表示连接是否成功/ SOC_CLOSE 表示是否被关闭, 服务器端也可以是关闭连接的val = SOC_READ|SOC_WRITE|SOC_CONNECT|SOC_CLOSE;ret = soc_setsockopt(soc_id, SOC_ASYNC, &val, sizeof(va
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号