博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MTK socket 小结 2
阅读量:2222 次
发布时间:2019-05-08

本文共 4242 字,大约阅读时间需要 14 分钟。

 

今天主要讲一下MTK socket 基本接口。MTK socket 主要是基于 ,用起来也就大同小异。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);

 

 

 

create 了一个socket,就像打开了一个文件,可以对其进行操作,当然操作前要稍微进行一些设置。

//关闭socket 与 soc_create 成对使用kal_int8 soc_close(kal_int8 s)
/************************服务器端 START **********************************/
// 绑定一个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);
/************************服务器端 END **********************************/
// 连接到一个指定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(val));

转载地址:http://fyifb.baihongyu.com/

你可能感兴趣的文章
Spring源码剖析9:Spring事务源码剖析
查看>>
重新学习Mysql数据库1:无废话MySQL入门
查看>>
探索Redis设计与实现2:Redis内部数据结构详解——dict
查看>>
探索Redis设计与实现3:Redis内部数据结构详解——sds
查看>>
探索Redis设计与实现4:Redis内部数据结构详解——ziplist
查看>>
探索Redis设计与实现6:Redis内部数据结构详解——skiplist
查看>>
探索Redis设计与实现5:Redis内部数据结构详解——quicklist
查看>>
探索Redis设计与实现8:连接底层与表面的数据结构robj
查看>>
探索Redis设计与实现7:Redis内部数据结构详解——intset
查看>>
探索Redis设计与实现9:数据库redisDb与键过期删除策略
查看>>
探索Redis设计与实现10:Redis的事件驱动模型与命令执行过程
查看>>
分布式系统理论基础1: 一致性、2PC和3PC
查看>>
分布式系统理论基础2 :CAP
查看>>
分布式系统理论基础3: 时间、时钟和事件顺序
查看>>
分布式系统理论基础4:Paxos
查看>>
分布式系统理论基础5:选举、多数派和租约
查看>>
分布式系统理论基础6:Raft、Zab
查看>>
分布式系统理论进阶7:Paxos变种和优化
查看>>
分布式系统理论基础8:zookeeper分布式协调服务
查看>>
搞懂分布式技术1:分布式系统的一些基本概念
查看>>