免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1091 | 回复: 0
打印 上一主题 下一主题

IPMsg飞鸽传书--文件传输解析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-11 17:47 |只看该作者 |倒序浏览
    这里继续讨论IPMSG飞鸽传书,前几天,详细的了解了IPMSG飞鸽传书的网络协议,详细分析并且实现了IPMSG飞鸽传书的消息传递过程,这里就IPMSG飞鸽传书中的文件和文件夹的传输做详细的说明。   
    在IPMSG 飞鸽传书中,如果要进行文件或者文件夹的传输,首先需要做的就是消息的应答,通过UDP发送文件传输报文,另外的IPMSG飞鸽传书客户端收到报文后,使用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是文件池的服务线程,它检测文件池的大小,如果非空,就会逐次传输文件。
   这里需要特别注意的就是关于文件夹的传输,这个IPMSG飞鸽传书一个难点,应为对与文件夹的内容是没有显示的,需要我们逐次的判断,在飞鸽传书中是这么处理的,如果是一个文件夹,就发送文件属性为IPMSG_FILE_DIR的信息包,IPMSG飞鸽传书客户端收到这个信息包后,就创建这个文件夹,然后发起发送的IPMSG飞鸽传书客户端,进入文件夹,传送文件夹内的文件,如果该文件夹下,还有文件夹,使用相同的方法,在文件夹内的文件传送结束后,就发送IPMSG_FILE_RETPARENT信息包,接受的IPMSG_FILE_RETP报文的IPMSG飞鸽传书客户端,执行返回上一级目录,IPMSG飞鸽传书发送端,就需发送目录下的文件。这样循环操作,最终完成文件的传输,这个过程比较难以理解。
  有了上边的知识,文件的接受也可以类推了,同样开启一个线程维护接受文件链表,逐次接受身下的文件,链表为空时,等待。
感悟:
  有很多的程序都是“池”这个概念,其实就是队列,而之所以称之为“池”,是因为这个队列有一个服务函数,可以这么认为:池=队列+服务函数,在以后的编程中,如果遇到多任务做逐次的处理,可以使用这个方法,开启一个线程用于维护这个队列,开启另外的线程用于处理这个队列,这样,就不用在加入新的任务的时候考虑是否旧任务已经完成,这样的话,程序的框架思路就非常的清晰,而且会非常的高效,如果在一些特殊情况下,任务的执行需要耗费很长的时间,而又对任务的快速执行要比较严格的要求,可以开启多个线程来服务这个队列。



   


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94039/showart_1924671.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP