注册 登录
LUPA开源社区 返回首页

yyq224444的个人空间 http://www.lupaworld.com/?439809 [收藏] [复制] [分享] [RSS]

我的博客

飞鸽程序分析(一)

热度 9已有 2890 次阅读2011-5-25 08:49 |个人分类:网络编程|系统分类:IT技术|

文件传输机制:

基本来说程序使用UDP发送消息,TCP发送文件。

UDP发送消息:

根据UDP无连接的发送特点,我们使用UDP协议来发送一些用户之间互相确认对方是否在线以及请求发送文件的消息等等。而消息的格式为:

0001:消息的编:发送者的名字:发送者的主机名:命令:附加的信息

主要由这五部分组成。例如当主机user的程序启动后会向全网发送消息

11234useruser_PC0I am online

这样所有局域网内的用户都会收到这个报文,然后解析后,就会得出user用户已经上线,然后再在界面上显示用户user的信息。

下面是几个常用的命令字段值和它的作用:

IPMSG_NOOPERATION      0x00000000UL不进行任何操作
IPMSG_BR_ENTRY     
0x00000001UL  用户上线
IPMSG_BR_EXIT        
0x00000002UL  用户退出
IPMSG_SENDMSG     
0x00000020UL  发送消息
IPMSG_RECVMSG      0x00000021UL     
通报收到消息
IPMSG_GETFILEDATA       0x00000060UL     
请求通过TCP传输文件
IPMSG_RELEASEFILES      0x00000061UL     
停止接收文件
IPMSG_GETDIRFILES        0x00000062UL     
请求传输文件夹

这是我们程序中常用的几个命令消息。

附加消息则包括一些别的数据,比如文件的属性,所在的位置,类型什么的,这个在后面具体讲文件的传输时再细细说。

举一个具体的UDP数据包的例子:

FF FF FF FF FF FF 00 1b 24 95 1a d0 08 00 45 00 00 3d 30 03 00 00 80 11 d3 2f c0 a8 00 66 ff ff ff ff 09 79 09 79 00 29 37 b8 31 3A 31 32 33 34 35 36 37 38 39 30 3A 75 73 65 72 3A 75 73 65 72 5F 50 43 3A 30 3A 49 20 61 6D 20 6F 6E 6C 69 6E 65

下面对这个包进行分析:

刚开始的FF FF FF FF FF FF是以太网协议中的目的MAC地址,00 1b 24 95 1a d0是本机也就是源MAC地址,08 00是以太网协议中的类型号。0800代表后面的是IP数据报的信息。所以45 00 00 3d 30 03 00 00 80 11 d3 2f c0 a8 00 66 ff ff ff ff IP数据报的首部,其中c0 a8 00 66是本机也就是源IP地址:192.168.0.102的十六进制表示,ff ff ff ff ff ff 则是目的IP地址,这里是255.255.255.255也就是个广播地址。再后面是UDP数据包的内容,09 79是源端口号的十六进制表示,软件默认的端口号是2425,后面的09 79是目的端口号。00 29 16UDP数据报长度,37 b8 UDP的校验和,在后面就是我们定义的具体的UDP的数据内容了31 3A 31 32 33 34 35 36 37 38 39 30 3A 75 73 65 72 3A 75 73 65 72 5F 50 43 3A 30 3A 49 20 61 6D 20 6F 6E 6C 69 6E 65这也就是1:1234567890:user:user_PC:0:I am online

通过对这个报文的内容解析,我们会得到192.168.0.102的主机user_PC已经上线。这就是对我们传输过程中使用的数据报的简单介绍,通过对这个 有了一定的熟悉后就能够比较有效率的理解整个程序了。

程序的整体分析:

主要的类

MsgMng:负责管理和实现数据和消息的传递的实现。

ShareMng:负责管理传输文件的个数的添加和删除的功能。

 

Dlg类:各种对话框类的父类

SendDlg:发送窗口类

RecvDlg:接受窗口类

ShareDlg:传输文件明细窗口类

 

MianWnd:主窗口类,各种主要的功能实现都是在这里实现的

TWin:窗口的父类,派生出了DlgMainWnd

 

重要的数据结构:
FileInfo
:文件的信息,包括文件的各种属性和获取各种属性的方法

ConnectInfo:连接信息类,主要包括连接信息,包括套接字,地址,端口号等等

AcceptInfo:主要包括接收文件的信息FileInfo的指针,文件个数,目录个数,完成个数等等

AddrObj类:地址信息类,地址和端口号。

Host类:主机的属性,包括在线主机的名字,状态,Hostsub属性

HostSub类:包括地址,端口号,主机名,用户名

 

SendFileObj:发送文件()类,包含发送文件的各种信息,主要包括文件名字,大小,以及之前出现的ConnectInfoFileInfo,文件的句柄,目录文件的句柄,路径名等……

RecvFIleObj:接收文件()类,包含接收文件的各种信息,与SendFileObject类似,还包括传送的偏移,以及接收的缓冲区,文件句柄,路径等。

BroadcastObject类:主要是UDP发送消息的信息类,负责获取广播信息中的主机地址信息。

 

除此之外,为了维护程序中的各种信息,比如在线用户的信息,发送文件的信息等,程序还定义了一些链表数据结构,主要有ListObj类,List类,RecycleList类。这些都是一些简单的双向链表和循环双向链表,主要用于作为之前一些数据结构的父类,使其实现各种数据的快速查找和维护。

 已同步至 yyq224444的微博

刚表态过的朋友 (0 人)

发表评论 评论 (2 个评论)

回复 转瞬繁华 2011-5-27 00:36
  

facelist

您需要登录后才可以评论 登录 | 注册
验证问答 换一个 验证码 换一个

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部