zoukankan      html  css  js  c++  java
  • Linux 下飞鸽传书设计实现

    Linux 下飞鸽传书设计实现

    1.系统功能

    根据飞鸽传书协议在 linux 下实现飞鸽传输程序,并且与 windows 下飞鸽兼容。具体功能模块包括用户上线,下线,刷新查看在线用户,收发消息,传送文件/文件夹功能模块。

    2.具体实现

    2.1 关键数据结构

    /*命令的结构*/

    typedef struct _command

     {

        int version;/*命令的版本*/

        int seq;/*包编号*/

        char srcName[100];/*发送者姓名*/

        char srcHost[100];/*发送者主机名*/

        int flag;/*命令*/

        char addtion[100];/*附加字段*/

     }command;

    /*在线用户信息*/

    typedef struct _userInfo

    {

        char name[MAXLINE];     /*姓名*/

        char host[MAXLINE];         /*主机名*/

        char group[MAXLINE];        /*所在的组名*/

        struct sockaddr_in addr;        /*地址信息*/

        struct _userInfo next;      /*链表中下一个*/

    }userInfo;

    /*在线用户列表*/

    typedef struct _uList

    {

        userInfo *userListHead;     /*链表头*/

        userInfo userListTail;      /*链表尾*/

    }uList;

    /*消息队列*/

    typedef struct _mesList

    {

        command *mesHead;

        command *mesTail;

    }mesList;

    2.2 程序主要结构

    本程序主要采用多线程结构,分为 receive(接收消息), process(处理收到的消息), sendData(发送文件) 三个子线程。线程间通信互斥锁与 Posix 信号量进行通信。

    2.3 函数接口

    (1) /*从文件描述符fd中读取count个字符存入buf中*/

     ssize_t readn(int fd,void *buf,size_t count);

    (2) /*将buf所指向的存储区中的len个字符吸入文件描述符fd中*/

     ssize_t writen(int fd,char *buf,int len);

    (3) /*用于字符串转换,网络传输中用gb2312编码,linux下gtk用utf-8编码,需要进行转换*/

     int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen);

    (4) /*在用户链表中加入新用户信息,加入成功返回1,否则返回0,使用userInfoMutex进行线程间通信控制*/

      int pushBack(uList *list,userInfo user);

    (5) /*在用户链表中删除指定地址信息的用户,删除成功后返回1,否则返回0,使用userInfoMutex进行线程间控制*/

      int delUser(uList *list, struct sockaddr_in addr);

    (6) /*判断该用户是否已经存在,已经存在则返回1,否则返回0,使用userInfoMutex进行线程间控制*/

    int isExist(uList *list,struct sockaddr_in addr);

    (7)清空用户链表,释放空间,用于用户退出和用户刷新时释放空间,使用userInfoMutex进行线程间控制*/

    int destroyList(uList *list);

    (8)/*创建命令字,com为要返回的命令字,flag 为消息标志,addtion 为附加标志*/

    void createCmd(command & com,int flag,char addtion[])

    (9)/*发送消息,com为要发送的消息,servaddr为要发送的地址,attach为文件附件信息*/

    void sendCmd(command com, struct sockaddr_in servaddr,char attach[]);

    (10) /*把收到的消息加入到消息队列中*/

    void addMes(mesList *mHead,command cmd);

    (11) /*把消息队列中头部的节点消息提取出来用于处理*/

    int delMes(mesList *mHead,command *cmd);

    (12)/*初始化操作,飞鸽登录时初始化消息链表,用户链表,信号量,套接字信息*/

     void init();

    (13)/*登录操作,发送用户上线消息*/

    void login();

    (14)/*解析收到的消息命令,提取各个字段*/

     int analysisCmd(command *cmd,char *buf);

    (15) /*接收消息线程处理函数,将收到的消息加入消息队列中,通过信号量waitNoFull和waitNoEmpty和消息处理线程进行通信。消息队列用mesMutex与其他线程进行通信,保证消息队列的正确性*/

     void *receive(void *arg);

    (16)/*gtk界面中显示在线用户信息*/

    void showUser(uList *list);

    (17)/*在gtk界面中显示消息*/

    void showMessage(char *message);

    (18)/*显示收到的信息*/

    void showRecvMessage(char *host,char *message);

    (19)/*分析文件的信息,提取有用的字段*/

    void fileAnalysis(char *recv,int *fNum,char *fName,int *fSize,int *fTime,int *fType);

    (20) /*保存收到的单个文件,saveName为保存的文件名*/

    void saveSignalFile(char *saveName);

    (21)/*分析目录附件,获得目录文件的文件名,文件大小,文件类型*/

    void getDirInfo(char *recv,char *fName,int *fSize,int *fType);

    (22) /*保存目录,saveName为要保存的目录*/

    void saveDir(char *saveName);

    (23)/*保存文件,recvType=1为保存文件,recvType=2为保存的目录,使用fileMutex来设置互斥性*/

    void saveFile();

    (24)/*收到单个文件*/

    void receiveSignalFile(char *recvFileName);

    (25)/*收到单个目录*/

    void receiveDir(char *recvDirName);

    (26)/*接收文件*/

    void receiveFile(command cmd);

    (27)/*信号处理线程,从消息队列中取出消息进行处理*/

    void *process(void *arg);

    (28)/*发送消息*/

    int sendMes();

    (29) /*将文件名进行转换*/

    char *transName(char *fileName);

    (30)/*发送文件*/

    void sendFile();

    (31)/*发送文件夹*/

    void sendDir();

    (32)/*用户点击刷新,刷新在线用户*/

    void refresh();

    (33) /*用户退出*/

    void quit();

    (34)/*传输文件夹数据,递归函数*/

    void transferDir(int fd,char *dir);

    (35)/*监听TCP套接口,发送文件与文件夹线程*/

    void *sendData(void *arg);

    (36)/*创建菜单*/

    static void create_popup_menu(GtkWidget *menu,GtkWidget *view);

    (37)/*右击选中treeview,显示传送文件与文件夹菜单*/

    static gboolean showTreeView(GtkWidget *eventBox,GdkEventButton *event,GtkWidget *menu);

    (38)/*选择要发送的文件 */

    static void selectFile();

    (39)/*选择要发送的文件夹*/

    static void selectDir();

    (40)/*选择要保存的文件名或文件夹名*/

    static void selectSaveFile();

    3.总结

        实现了linux下飞鸽传书的基本功能,并且能与window下飞鸽进行通信,传文件。熟悉了linux下网络编程,多线程编程及线程间通信(主要用到信号量与互斥锁)。但加密解密那块没有完成,程序结构不是很好,界面做得太差。有空应该看看设计模式.

  • 相关阅读:
    代码规范
    svn的牛逼操作反向merge
    QT 半透明遮罩(弹窗)
    ACE库 ACE_Handle_Set类解析
    linux系统如何启用ftp服务
    vim color
    Linux动态库应用
    自建工程makefile文件
    Makefile工程文件
    linux杂记
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2039564.html
Copyright © 2011-2022 走看看