【编程总结】足球俱乐部

(一)登陆模块

程序的第一个模块就是登陆模块,做成一个提供注册和登陆功能的类。密码保存的结构为:

0

1

 

 

 

 

..

512

513

 

 

 

 

1024

V1

Gap1

gap

Offset

gap

正文

 

V3

Gap2

Gap

长度

gap

正文

 

V2

参数包括密钥文件验证的和密钥信息提取(间隔量,偏移量)的。整个思路是半动态的,同样的用户名密码每次生成的密钥文件是不同的,正文在密钥文件中的位置也是变化的,但是控制这些变化的参数在程序中是静态的,反编译技术应该就能够找出这些规律,从而伪造密钥文件或用其他方式来破解。

 

(二)文件系统

文件系统是用VC提供的CFile类和CARCHIVE来做的,是将文件全部加载到内存,修改后将内存内容全部放回硬盘,不是分段读写修改操作,因为那样做太复杂,也容易出错,在文件数据量不大的情况并不实惠。

关于CFile文件读写小结:

文件指针从0开始,读写后都会自动向后推,当前指向下一次读写的位置。

seek调整文件指针,0不移动,n移动n格。

 

(三)对话框类之间的交互

  对话框类的交互是设计的一个小小的难点吧,因为要涉及到五个以上对话框,所以他们之间的交互是一个问题。这种交互包括数据和方法。

  我并不是采用继承的方法模型化他们的关系,而是用包含的模型。我认为继承关系并不合适,首先他们都是对话框,另外,他们的生命周期重叠、地位一致,等等,而包含关系能够表示这一切。其他对话框包含在一个主对话框下,于是就形成一个类包含其他好几个类的关系,他们之间的数据交换关系有两种(我采用的),一种是直接的,通过this指针把控制权赋给所属的类(因为下属类是上级类的数据成员,所以在其方法中并没有上级类的实例或实例指针来直接操控上级类),这种方法比较直接,还有一种相对不怎么直接的方法,就是通过上级类调用下属类的方法把指定的数据指针或引用传给下属类,这种方法可以良好的控制他们之间交互的数据,如果没有这种控制的需求,或需要控制任何可能的上级类的数据,那么这种方法都不是最优选择。但我似乎没有发现在这种类与类包含关系中有像继承关系中的protected关系之类的直接的指定数据传递并且私有化的机制。

  通过this指针的传递可以实现方法的调用。这里要说的是VC中模态对话框的创建中存在的一个tricky问题,当你domodal一个模态对话框,并在这个对话框类中domodal一个新的模态对话框,并通过这个对话框来onOK前一个模态对话框,会出现错误,或者在下一次domodal时候会出错。具体原因我也不太了解,应该是模态对话框机制的问题,只能由自身终结,要做对话框间的频繁切换,非模态对话框或许是更好的选择。

 

(四)命令式搜索

  这个要求输入命令字符串,查找出满足要求的俱乐部或球员。这是一个难点,但也不是特别难,因为已经做过相关的数学式的计算的程序。主要就是把命令表达式通过预处理将具体每原子项(也就是要求)的真值求出来形成逻辑表达式(比如@name=ct||@name=tc,就逐一扫描所有球员,把满足条件的原子项换位1,不满足的换为0,最后就成了0 || 1这样的逻辑表达式了),逻辑表达式的计算就可以用堆栈来做了。把逻辑表达式值为1的俱乐部或球员取出来放到一个表中,就得到搜索结果了。

 

(五)网络交互:

  socket 来传送信息。交互分为阻塞和非阻塞的,阻塞的就是等待回应,不回应进城就堵塞住了,执行不了其他操作,非堵塞就是不管回应发送完信息后先返回,等对方的回复到了再响应。其实,由于这个项目的要求是基于小数据的,并且,所有的功能都是符合阻塞模型的,所以用阻塞模型就能很直接的解决问题,但是我由于对话框类的存在等总总问题莫名其妙地就选择了非阻塞的方式,但这也能良好的工作。从服务器来看,服务器是响应型的,接收到信息就处理,处理后就响应客户端。从客户端来看,客户端是基于用户消息型的,用户交互产生消息,消息响应中发送信息到客服端,得到请求后回复客户,请求失败也作出一定的回应。

  在整个网络模型的具体实现中,技术核心包括,对话框与网络的关系以及数据传输的格式。对话框与网络的关系是,网络得到相应的信息后,并根据当前所处的对话框状态,跳转到下一个对话框状态,隐藏当前对话框,刷新新的对话框并显示,用的是有限状态自动机模型。

对于多客户的支持来自两个方面,一个是数据格式上的,每次交互都发送验证信息,并且验证消息附带动态码(每一个俱乐部客户在每一次登陆都会生成随机的验证码),另外,当服务端正在进行相关信息的修正时,客户端的“写操作”是被禁止的,就保证了数据的统一性。数据传输的格式是:

  服务端到客户端:验证码+信息槽1+信息槽2。验证信息每次都传,信息槽1用来传送操作指令,有相对统一的格式,而信息槽2的格式则依赖于信息槽1中的指令。

客户端到服务端:身份码+即时码+请求信息。

信息传递的格式满足了基于消息的运作机制。

 

(六)其他

程序的代码量在四五千行之间,编码时间是一周中课余时间。

总的说是学到了一些东西,对面向对象的编程当中类的关系有了更多的理解,对MFC的使用也学了一些东西,网络编程也开了个头。

 

附图几张:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值