用MFC学习p2p视频技术_第1页
用MFC学习p2p视频技术_第2页
用MFC学习p2p视频技术_第3页
用MFC学习p2p视频技术_第4页
用MFC学习p2p视频技术_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1. 架构说明目前的协议有如下一些特点:1) 客户向服务器发送请求,每个请求的长度不定请求的长度在第一个int中指定.2) 每个服务器通常会向多种客户提供服务,例如,ts要同时向cp,np提供服务, cp要向np和其他cp捉供服务,同时还是其他cp, ts, sp的客户.3) 每个服务器为客户服务时,通常是长期的,会涉及多次请求应答的来回.这样的结构,主要是为了能够支持大量并发客户连接而设计的.在具有大量并发客户 连接时,无论采用线程还是进程,都无法进行有效的服务,因此必须采用select 轮询方式.2. 基本数据结构说明对于每个客户端,需要保存该客户端相应的一些信息.目前的cpnew.c,

2、spnew.c和tsnew.c的核心数据结构基本相同,都由session,sessioncluster (tsnew.c 中)或者 serverdesc (cpnew.c 和 spnew.c)构成.其屮,session是每个客户端相关的数据,sessioncluster(或者是serverdesc)是 有关每种服务的信息,其小有一个指向该服务相关的各个session的指针.session 这一数据结构不是在有客户请求时动态分配的,而是在最开始初始化时就已经分配 好的,当有新客户请求到來时,服务器搜索这一预先分配好的这些session,发现其中 有空闲则使用,如果没有空闲就报告错误.对于ts和c

3、p(sp)来说,最大的区别是ts使用udp协议,而cp和sp则使用tcp协议,二 者的不同在于:1) 对于tcp协议的客户端,由于每个客户端都使用不同的socket,因此select之后 只需要看各个客户端的fd_set是否置位就可以了,而对于udp客户端,找到相应的 客户端需要进行一次查找过程.ts使用了一些措施来减轻查找所带来的开销.2) tcp协议中,发来得数据是流形式的,因此需要进行消息分块,有可能两个消息 在一次read中读完,也有可能一个消息需要读很多次,这两种情况都蛊要考虑,因此 每个session中都有一个buf, rstart, rlen,用來存储读來但还没有处理的消息,同样

4、,写的过程屮也需要考虑写的时候有可能没有一次写完,因此也需要每个session屮 保留wbuf, wstart, wlen三项.udp中则不同,在协议实现中假设每个udp数据包屮 所包含的消息都是完整的,因此没有这几项.sessioncluster(或者是serverdesc)來说,描述了一个服务,这个服务|+1这样几个 主要的部分构成1) sock:描述所所使用的socket2) cur:当前客户端的个数3) max:最多容纳客户端的个数4) head: session 的头,head0为第一个 session, headmax-l为最后一个 session5) init:这一服务屮每个se

5、ssion需要执行的初始化操作.(函数指针)6) process:这一服务中消息的处理函数7) closure:这一服务中需要的析构函数3. 主要结构说明 process_chil止主要函数,这一函数主要用来设置socks和wsocks,对于sp和cp,只有session的wlen>0的时候才设置wsocks; select;对于每个 serverdesc(或者 sessioncluster),进行 process_type在sp和cp中,为了支持pushlist操作,在每一次循环前先要进行processjob在cp中,还周期进行periodcheck,用来将过期的连结清除在ts中,周期

6、进行periodlog,用來将过期的客户连接清除process_type:对于每个session,检查是否可读.如果可读,检查是否有完整的消息,*(unsigned int *)(rbuf+rstart) <= hen调用相应的process直到没有完整的消息为止检查是否可写,如果可写且wlen>0,则进行写4. 英他重要的模块1) 配置模块配置模块主要由 struct nam vai, read_config, free_config 组成,nam vai 结构屮,name是在cfg文件屮的名字,ptr是指向存放的指针,type是数据的类型,目前支持这样 几种类型d:整数类型,p

7、tr是一个整数指针宅:字符串类型,ptr是一个指向指针的指针,(char *)b:字符串buffer类型,pu*是一个char *,使用这种类型时应当注意,对于宅类型, read_config将为该val分配内存(malloc),但是对于h类型,pti所指向的必须是i_!经 分配好的内存两个重耍的函数分别为:read_config,参数为文件名,一个 struct namval *,以及该 struct namval 的项数 free_config,参数为和 read_config 相同的 struct namval *以及项数2) mysql 模块mysql模块主要有mysql *local

8、_mysql以及三个函数构成,这三个函数是 init_mysql,初始化 mysql,返回一个 mysql一般用来初始化 local_mysqlquery_mysql,执行一个 mysql 语句,格式为 query_mysql (local_my$ql, "mysql 语句, 其中格式和printf的格式相同,例如delete from %s等”,所需要的值) query_mysql_select,执行一个mysql的select语句,与上面不同的是,它返冋一个 mysql.res *.3) network排序模块这-模块主要由 networks 结构,readnetblock 函数

9、,getnetwork 函数,comparenet 函数 构成,其中,readnetblock用来读入network配置文件,初始化全局变暈netblocks, netblocks 是一个networks结构数组,有max.net项.getnetowrk用來查找和一个ip地址最接近的netblockcomparenet是在qsort中用到的一个函数,对找到的nppeer进行排序,让同一个网络 屮的nppeer排在前面.4) 图管理在目前的cp, sp, np中,cp可以同时加入多个频道,而np也可以有多个资源,为了描述 这种结构,引入了图的概念.每个边(edge)存储了指向np的指针,指向ch

10、annel的指针, 在ts屮还需要存储这一 session在这一 channel中的各个interval.每个channel通过edge 中的cnext串成一个链表,这个链表的头是channel结构中的peerhead,而每个session 通过edge中的enext也串成一个链表,这个链表的头是session结构中的header.相关的函数有:newedge:新添一个边,参数为channel *, session 对于ts还需要一个channelinfo来 初始化edge中的信息deledge:删除一个边,参数为edge *5) channel 模块channel模块的功能主要是:ts中用来

11、处理need_peers, sp中还需要保存和查找频道数据,频道都使用图结构进行管 理.频道的搜索为了效率方面的因素,采用了 hash进行搜索,channelhash中使用的是字符串 hash,女口 hash_str 所示.ts中的channel相对较为简单,sp和cp中channel还需要管理channel相关的数据.这些 数据以文件的形式存在硬盘上/var/tmp/目录下,文件名随机生成,对于每一块的相关信息, 由 blockdata 來保存,blockdata 中的 firstsampl, message_size, messaged, offset 分别 存储了 firstsample

12、信息,快的长度,块的id,以及在文件中的offset.sp和cp的处理有所不同,对于cp,块是以hash的方式来存放的,例如,块的id为1000,而 max_queue为100,则存储位置为1000% 100=0.对于sp,如杲资源是一个cs发来的频道, 则是一个循环队列,每一块按照次序分别存放在相应位置,如果到了队列尾部,就再从 队列头开始.如果资源是文件,就不保存blockdata信息,直接根据blockld到原文件定位.涉及 channel 的函数有很多,女口 locate_by_id, locate_order_by_id, newchannel, freechannel, saveb

13、lock 等.6) berkeley db 模块这只在sp中涉及,主耍是打开db文件,查询某个md5的位置.主要涉及到db* mediadb, opendb, openmedia 这两个函数 opendb:参数为db文件的名openmedia:参数为md5和一个整数指针,返回file *以及该文件的长度,在整数指针中7) job模块job模块用在cp和sp中,用来处理pushlist, pushlist消息可以重新设置job的列表, 也可以添加job或者是删除job.涉及到job.c中的函数和jobdes结构.jobdes结构 中一个session *, 一个channel *用于标识该job

14、所属的session和channel, num表示 所需要下载的blockid数,job是一个指向整数的指针,mask也是一个指向整数的指针, job i 是需要下载的blockid,如果mask i 为0,则需要进行下载,如果为1,则不需要.addjob:添加job的时候,不检查该job是否已经在列表中,直接生.成一个job然后 添加到链表中.deletejob:删除job时,检查所有job列表屮的具有相同session和channel的job, 然后将需要删除的blockid的相应mask设置为1.processjob:对于每个 job,从 cur 开始,利用 process_p2p_re

15、quest_rea 1 来传输 笫一个mask为0的块,如果都为1,就删除这个job.freejob:删除某个 jobdes.freejoblist:删除某个session的所有jobdes,通常用于该session退出时使用.8) interval 模块interval模块用在ts中,用來表示np上面所有的快区间,冃前块区间市一个开始 字段和一个长度字段来标识.对于interval的主要操作是merge和delete, merge 是将原有的interval和新的interval列表合在一齐,而delete则是从原有的当中 去掉新的.merge:算法如下,使用了缓冲interval列表tmp

16、.if (old i < newj) tmpk = old i ;else tmpk = newj;然后再看old和new中哪些能够可以和tmpk合并delete:较为复杂一些,考虑下面几种情况oldl i 的开始比newj的结束大old i 的结束在newlj的开始前 old i 和ncwj有共同部分,而且old i 1 含在 newfjl 中 newj含在 old i 中 互不包含,new山在前 互不包含,oldi在前5. 些快速算法1) 在使用udp的ts屮,在客户初次登录时,需要查找空闲的session,此外,客户有可能 会重复发送login消息,这时需要检查这一客户端是否已经在

17、session列表中,第三,当 客户端发送消息时,需要找到相应的session.为了避免这些查询,分别使用了如下方法.首先,建立一个hash表,开始的吋候所有空闲session都串到hash0处,每当来一个 新的客户端时,从hash0中取出session,链到相应的hashid上 为此hash所得的值不能为0,如果为0,就返回最大的可能hashid.根据来源端口和ip地址查询session也使用这一 hash表.客户端发送消息吋,使用了用于验证的7个字节中的前3字节,用这3字节来标识session 的下标,这样就避免了查询开销.2)使用mnxid来减少搜索次数.在tcp中没有使用hash,使用

18、了 maxid这一项,用来记录session中最大的id,由于在 session初始化的时候,是查找id最小的空闲session,因此可以认为session是比较紧凑的,由于sp和cp支持的客户端要比ts少得多,因此这样的处理是可以接受的. 在客户退出的时候,有可能需要更新maxid,这一更新是rtl clientclosure来完成的, clientclosure更新maxid,然后再调用相应的析构函数.3)长期idle的连接的超时处理.由于超时处理盅要遍历整个列表,为了节约系统资源, idle时间比较长,此外,一般还需要定期报告系统统计数字,因此需要及时性.为此, 一般periodlog或

19、者periodcheck都判断是执行这两者屮的哪一种操作.4)查询cppeer时,考虑到目前只支持gcp,因此直接釆用了 gcpchoice,设置为当前 负载最小的gcp,在gcp报告或者是gcp登录,退出的时候更新.6. 消息处理1)ts消息处理np2ts_login: np向ts登录,按照来源ip地址和所报告的npport进行hash,如果距离上 次发送np2ts_login消息的时间小于s1lence_t1me,则直接返冋,否则发送welcome 消息.np2ts_report:报告interval信息,如果refresh为true,则重置,否则则先增加后删除. np2ts_need_peers:查询 peei信息,使用 findcppeer 寻找合适的 cp,使用 findnppeers 寻找合适的np. np寻找时,找到结果后按照networks來排序,保证在同一个网络中的 排在前面.np2ts_logout:退出np2ts_res_list:发送当前np的所有resource,使用addsession来进行处理,如果还没 有这条边,就添加np2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论