飞鸽传书文件传输实现原理
来源:互联网 发布:桃谷绘里香推荐 知乎 编辑:程序博客网 时间:2024/04/30 03:26
开发多年的飞鸽,在他的基础上增加了些许功能,例如语音对话,这里继续讨论FreeEIM(飞鸽传书),前几天,详细的了解了FreeEIM(飞鸽传书)的网络协议,详细分析并且实现了FreeEIM(飞鸽传书)的消息传递过程,这里就FreeEIM(飞鸽传书)中的文件和文件夹的传输做详细的说明。
在FreeEIM(飞鸽传书)中,如果要进行文件或者文件夹的传输,首先需要做的就是消息的应答,通过UDP发送文件传输报文,另外的FreeEIM(飞鸽传书)客户端收到报文后,使用TCP协议发送应答报文,这样就开始进行文件的传输了。
这里开启两个线程,线程1负责文件的传送,线程2负责文件的接受,下边做一一说明。
首先,我们知道,可以发送多个文件,这些文件需要建立链表保存信息。
typedef struct file_info
{
struct file_info *next; //双向链表
struct file_info *forward;
char *file; //文件名
int type; //文件类型:文件或者文件夹
int size; //文件大小
struct sockaddr_in addr; //目标网络信息
} FILE_INFO;
文件传送链表由专门的线程维护,这样,线程1就可以专心进行处理文件传输队列就可以了,线程1始终查询这个链表,如果表头为NULL,就说明没有要传输的文件,表头非空,就开始发送报文,获得正确的应答后,就可以开始文件的传输了,文件传输结束,将相应的链表节点删除。这里借鉴了很多程序中使用非常广泛的“命名池”相关的概念,只不过这里我们使用的是“文件池”,可以这么认为,如果有文件要传输,可以不用考虑是否有文件正在传输,只要把要传输的文件放入 “文件池”就可以了 , 同时,不用考虑“文件池”的大小,线程1是文件池的服务线程,它检测文件池的大小,如果非空,就会逐次传输文件。
这里需要特别注意的就是关于文件夹的传输,这个FreeEIM(飞鸽传书)一个难点,应为对与文件夹的内容是没有显示的,需要我们逐次的判断,在飞鸽传书中是这么处理的,如果是一个文件夹,就发送文件属性为IPMSG_FILE_DIR的信息包,FreeEIM(飞鸽传书)客户端收到这个信息包后,就创建这个文件夹,然后发起发送的FreeEIM(飞鸽传书)客户端,进入文件夹,传送文件夹内的文件,如果该文件夹下,还有文件夹,使用相同的方法,在文件夹内的文件传送结束后,就发送FREEEIM_FILE_RETPARENT信息包,接受的FREEEI_FILE_RETP报文的FreeEIM(飞鸽传书)客户端,执行返回上一级目录,FreeEIM(飞鸽传书)发送端,就需发送目录下的文件。这样循环操作,最终完成文件的传输,这个过程比较难以理解。
有了上边的知识,开发文件传输功能就变得简单多了,文件的接受也可以类推了,同样开启一个线程维护接受文件链表,逐次接受身下的文件,链表为空时。文件传输会遇到文件读写问题,有的文件发送是被打开了,这样会造成访问违规,所以要有相应的处理,才能让程序更加稳健。
- 飞鸽传书文件传输实现原理
- 飞鸽传书文件传输实现原理
- 飞鸽传书文件传输实现原理
- 浅谈飞鸽传书实现原理
- 浅谈飞鸽传书实现原理
- 飞鸽传书的实现原理
- 飞鸽传书实现原理
- IPMsg飞鸽传书--文件传输解析
- 飞鸽传书 文件传输软件
- 飞鸽传书(Ipmessage)软件的实现原理
- IPMSG飞鸽传书6--文件传输解析
- PERL模拟飞鸽传书文件传输总结
- 飞鸽传书源码分析五-文件传输
- sendfile原理,实现文件传输性能的提升
- sendfile原理,实现文件传输性能的提升
- sendfile原理,实现文件传输性能的提升
- sendfile原理,实现文件传输性能的提升
- 关于飞鸽传书软件的实现原理,配置及使用方法
- procedure 创建模板
- 深入理解iPhone委托模式兼谈iPhone生命周期
- 让笔记本电脑的电力更长的一些小技巧
- 飞鸽传书 FEIMT 源码
- 手机、数码相机数据丢失恢复方法汇总
- 飞鸽传书文件传输实现原理
- 会比赛的飞鸽
- 关于图像采集卡采集到图像到内存后怎样用Opencv进行图像处理
- dataset数据转换成json的格式通用方法
- 我需要帮助
- 调查投票软件
- gdb调试程序(linux 下程序开发)
- 做成才还是做许三多——反思程序员职场生涯规划
- Oracle表空间的管理