- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1. 架构说明目前的协议有如下一些特点:1) 客户向服务器发送请求, 每个请求的长度不定. 请求的长度在第一个INT中指定.2) 每个服务器通常会向多种客户提供服务, 例如, TS要同时向CP, NP提供服务,CP要向NP和其他CP提供服务, 同时还是其他CP, TS, SP的客户.3) 每个服务器为客户服务时, 通常是长期的, 会涉及多次请求-应答的来回.这样的结构, 主要是为了能够支持大量并发客户连接而设计的. 在具有大量并发客户连接时, 无论采用线程还是进程, 都无法进行有效的服务, 因此必须采用select轮询方式.2. 基本数据结构说明对于每个客户端, 需要保存该客户端相应的一些信息. 目前的CPnew.c, SPnew.c和TSnew.c的核心数据结构基本相同, 都由Session,SessionCluster (TSnew.c中) 或者 ServerDesc (CPnew.c和SPnew.c)构成.其中, Session是每个客户端相关的数据, SessionCluster(或者是ServerDesc)是有关每种服务的信息, 其中有一个指向该服务相关的各个Session的指针. Session这一数据结构不是在有客户请求时动态分配的, 而是在最开始初始化时就已经分配好的, 当有新客户请求到来时, 服务器搜索这一预先分配好的这些Session, 发现其中有空闲则使用, 如果没有空闲就报告错误.对于TS和CP(SP)来说, 最大的区别是TS使用UDP协议, 而CP和SP则使用TCP协议, 二者的不同在于:1) 对于TCP协议的客户端, 由于每个客户端都使用不同的socket, 因此select之后只需要看各个客户端的fd_set是否置位就可以了, 而对于UDP客户端, 找到相应的客户端需要进行一次查找过程. TS使用了一些措施来减轻查找所带来的开销.2) TCP协议中, 发来得数据是流形式的, 因此需要进行消息分块, 有可能两个消息在一次read中读完, 也有可能一个消息需要读很多次, 这两种情况都需要考虑, 因此每个Session中都有一个buf, rstart, rlen, 用来存储读来但还没有处理的消息,?同样, 写的过程中也需要考虑写的时候有可能没有一次写完, 因此也需要每个Session中保留wbuf, wstart, wlen三项. UDP中则不同, 在协议实现中假设每个UDP数据包中所包含的消息都是完整的, 因此没有这几项.SessionCluster(或者是ServerDesc)来说, 描述了一个服务, 这个服务由这样几个主要的部分构成1) sock: 描述所所使用的socket2) cur: 当前客户端的个数3) max: 最多容纳客户端的个数4) head: Session的头, head[0]为第一个Session, head[max-1]为最后一个session5) init: 这一服务中每个Session需要执行的初始化操作. (函数指针)6) process: 这一服务中消息的处理函数7) closure: 这一服务中需要的析构函数3. 主要结构说明process_child: 主要函数, 这一函数主要用来设置socks和wsocks, 对于SP和CP, 只有Session的wlen0的时候才设置wsocks;select;对于每个ServerDesc(或者SessionCluster), 进行process_type在SP和CP中, 为了支持PUSHLIST操作, 在每一次循环前先要进行processJob在CP中, 还周期进行periodCheck, 用来将过期的连结清除在TS中, 周期进行periodLog, 用来将过期的客户连接清除process_type:对于每个Session, 检查是否可读. 如果可读, 检查是否有完整的消息,*(unsigned int *)(rbuf+rstart) = rlen调用相应的process直到没有完整的消息为止检查是否可写, 如果可写且wlen0, 则进行写4. 其他重要的模块1) 配置模块配置模块主要由struct NamVal, read_config, free_config组成, NamVal结构中,Name是在cfg文件中的名字, ptr是指向存放的指针, type是数据的类型, 目前支持这样几种类型d: 整数类型, ptr是一个整数指针s: 字符串类型, ptr是一个指向指针的指针, (char **)b: 字符串buffer类型, ptr是一个char *, 使用这种类型时应当注意, 对于s类型
原创力文档


文档评论(0)