精华内容
下载资源
问答
  • 自己想写个手机版的飞鸽,所以翻译了一下,即使不打算自己做个飞鸽,学习下人家的协议还是好的。 那段暂没翻译。
  • XEIM 飞鸽传书传输协议/飞鸽传书服务端源码/飞鸽传书客户端源码<非原创 谢谢>
  • 飞鸽传书协议分析

    千次阅读 2015-09-18 14:25:49
    http://wenku.baidu.com/link?url=J-BPtBw31gFLISLfHjfMNjxUXnagHnBw6F3fxzyju1EKkRaMEOvKtQOYe58qMF29oF2pYaOqftyQxvEH7_x6dLgKP-yk_4y7_zbE3ROpYBy
    展开全文
  • 飞鸽传书 Mac版

    2015-03-17 16:07:32
    飞鸽传书 Mac版,地球人都知道。方便局域网内快速传输文件,聊天。
  • 飞鸽传书协议,客户端,服务器端程序 C++
  • 最近看到一些朋友在编写网络程序是遇到一些问题,故把以前做IPMSG时翻译的文档贴过来,希望对网络编程新手有所帮助,在寻找编程项目的同学们也可参照此文档写出自己的IPMSG。
  • ipmsg(类似飞鸽传书)

    2015-12-29 09:13:36
    有了飞鸽传书2010,局域网间传送文件不必再共享来共享去的了。而且,该软件极度绿色哦:单个执行文件,完全与注册表、初始配置文件没有关系。基于TCP/IP(UDP). 可运行于多种操作平台(Win/Mac/UNIX/Java), 并实现跨...
  • 自己想写个手机版的飞鸽,所以翻译了一下,就算不打算自己做个飞鸽,学习下人家的协议还是好的。 因为没用上,所以关于加密那段没翻译。
  • 基于LINUX 下,C语言实现的飞鸽传输项目,是学习linux网络编程...主要包括:TCP/IP的协议,TCP实现文件的传输,UDP消息和广播,以及网络多线程操作实现。 此外还包含一个方便调试项目的飞鸽传输WINDOWS下的应用程序。
  • 分析,飞鸽传书中 ,文件传输的核心过程。 非常详细,透彻。。对于看过飞鸽源码的人,还是有帮助的
  • Linux下飞鸽传书实现

    2021-05-12 16:18:28
    系统功能根据飞鸽传书协议在linux下实现飞鸽传输程序,并且与windows下飞鸽兼容。具体功能模块包括用户上线,下线,刷新查看在线用户,收发消息,传送文件/文件夹功能模块。2.具体实现2.1关键数据结构/*命令的结构*/...

    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下网络编程,多线程编程及线程间通信(主要用到信号量与互斥锁)。但加密解密那块没有完成,程序结构不是很好,界面做得太差。有空应该看看设计模式.

    界面截图(界面比较垃圾):

    8840814c21e037c536ae44075b13e0ff.png

    附:

    飞鸽协议: http://bbs.chinaunix.net/viewthread.php?tid=1015775

    posted on 2011-03-15 21:57 周强 阅读(1240) 评论(0)  编辑 收藏 引用 所属分类: linux 、网络编程

    展开全文
  • IPMsg飞鸽传书网络协议解析手记

    千次阅读 2015-09-18 14:36:35
     相信很多人都使用过飞鸽传书,这个小工具在局域网传输数据高效而便捷,自己在大二的时候就想看看飞鸽传书的源码,但那时候自己的水平有限,这几天有机会重写飞鸽传书,也对IPMSG的网络协议做了深入的研究,这里也...

    http://blog.chinaunix.net/uid-21222282-id-1829137.html


       相信很多人都使用过飞鸽传书,这个小工具在局域网传输数据高效而便捷,自己在大二的时候就想看看飞鸽传书的源码,但那时候自己的水平有限,这几天有机会重写飞鸽传书,也对IPMSG的网络协议做了深入的研究,这里也要感谢IPMSG的作者公开源代码。

       首先需要明确IPMSG的主要功能,IPMSG可以局域网通信、传输文件、传输文件夹,可以通过添加局域网外IP来实现网外的聊天与文件传输功能。我们先分析下IPMSG的聊天功能,IPMSG通过UDP协议实现聊天,当一个IPMSG的客户端运行开始,首先它向整个局域网广播上线报文,局域网内的其他IPMSG客户端收到上线报文后,回复该报文,回复报文中包含了该客户端的IP PORT 用户名 机器名。这样在上线客户端通过广播发送上线报文后,局域网内的其他所有IPMSG客户端都发送一个回复报文,这样,所有IPMSG的客户端都更新自己的在线用户列表。这样IPMSG的上线就算结束了,接下来,如果有客户端发送消息,而消息是通过UDP来完成的,客户端通过查询自己用户链表获取其他用户的网络地址信息,发送消息给其他用户。总结一下:

    ipmsg可以用于收发消息和文件(夹)

    使用UDP协议收发消息使用TCP协议收发文件(夹)

    默认使用2425端口做数据传输(TCP/UDP)

    包含以下功能

    用户上下线识别

    消息收发

    文件传输文件夹传输

    IPMSG的报文格式:版本号:包编号:发送者姓名:发送者主机名:命令字:附加信息

    整个报文通过字符串的形式发送,IPMSG的版本号为1,而包编号必须是不重复的数字,这里可以是用比较简洁的方式,就是通过linux的库函数timer来完成,time 函数返回从1970 年1 月1 日0 点以来的秒数.所以每个运行timer()的结果都是不一样的,可以放心使用。报文中的命令字是指明这个报文是消息、上线通告、传输文件、传输文件夹还是其他的东西,附加信息在不同的命令字下是不一样的,如果命令字是消息,那么附加信息就是消息内容,如果命令字是传输文件,那么附加信息就是文件的信息了,我们来看一下命令字,这是IPMSG最为重要的内容。

    /*    @(#)Copyright (C) H.Shirouzu 1996-1998 ipmsg.h    Ver1.34 */

    #ifndef IPMSG_H
    #define IPMSG_H

    /* IP Messenger Communication Protocol version 1.0 define */
    /* macro */
    #define GET_MODE(command)    (command & 0x000000ffUL)
    #define GET_OPT(command)    (command & 0xffffff00UL)

    /* header */
    #define IPMSG_VERSION            0x0001
    #define IPMSG_DEFAULT_PORT        0x0979

    /* command */
    #define IPMSG_NOOPERATION        0x00000000UL

    #define IPMSG_BR_ENTRY            0x00000001UL
    #define IPMSG_BR_EXIT            0x00000002UL
    #define IPMSG_ANSENTRY            0x00000003UL
    #define IPMSG_BR_ABSENCE        0x00000004UL

    #define IPMSG_BR_ISGETLIST        0x00000010UL
    #define IPMSG_OKGETLIST            0x00000011UL
    #define IPMSG_GETLIST            0x00000012UL
    #define IPMSG_ANSLIST            0x00000013UL
    #define IPMSG_FILE_MTIME        0x00000014UL
    #define IPMSG_FILE_CREATETIME        0x00000016UL
    #define IPMSG_BR_ISGETLIST2        0x00000018UL

    #define IPMSG_SENDMSG            0x00000020UL
    #define IPMSG_RECVMSG            0x00000021UL
    #define IPMSG_READMSG            0x00000030UL
    #define IPMSG_DELMSG            0x00000031UL

    /* option for all command */
    #define IPMSG_ABSENCEOPT        0x00000100UL
    #define IPMSG_SERVEROPT            0x00000200UL
    #define IPMSG_DIALUPOPT            0x00010000UL
    #define IPMSG_FILEATTACHOPT        0x00200000UL

    /* file types for fileattach command */
    #define IPMSG_FILE_REGULAR        0x00000001UL
    #define IPMSG_FILE_DIR            0x00000002UL
    #define IPMSG_LISTGET_TIMER            0x0104
    #define IPMSG_LISTGETRETRY_TIMER    0x0105

    #define HS_TOOLS        "HSTools"
    #define IP_MSG            "IPMsg"
    #define NO_NAME            "no_name"
    #define URL_STR            "://"
    #define MAILTO_STR        "mailto:"
    #endif         /* IPMSG_H */

      报文中的命令字是一个32位无符号整数,包含命令(最低字节)和选项(高三字节)两部分
    常用基本命令(带有BR标识的为广播命令),下边是一些重要的命令字。
    IPMSG_NOOPERATION 不进行任何操作
    IPMSG_BR_ENTRY 用户上线
    IPMSG_BR_EXIT 用户退出
    IPMSG_ANSENTRY 通报在线
    IPMSG_SENDMSG 发送消息
    IPMSG_RECVMSG 通报收到消息
    IPMSG_GETFILEDATA 请求通过TCP传输文件
    IPMSG_RELEASEFILES 停止接收文件
    IPMSG_GETDIRFILES 请求传输文件夹
    在IPMSG上线时,首先发送的是IPMSG_NOOPERATION,默认是不做任何处理,然后上线通告报文IPMSG_BR_ENTRY 。
     
    用户列表通过链表来实现,看看结构体:

    typedef struct use_date
    {  
      char use_name[USE_NAME_LEN];   //用户名
      char host_name[HOST_NAME_LEN];  //机器名
      int id;               //节点ID。
      long int host_ip;     //存储IP信息,避免重复添加
      struct sockaddr_in inet;  //存储网络信息
      struct use_data *next;
    }IPMSG_USE;

    每次IPMSG在收到上线通告报文后,都要查找相同ip的节点是否已经存在,只要和结构体成员host_ip比较就可以了,这样整个用户列表当中的成员是不会重复的。报文的发送主要依靠下边的函数实现,这里推荐下边的这种写法,特别是对与命令比较多的情况下,使用下边的好处就在与结构非常的清晰。

     

     

    mode: 命令  msg: 附加信息 struct sockaddr *p:网络信息  fd:网络套接字描述符 

    int msg_send(const int mode,const char *msg,const struct sockaddr *p,int fd)
    {
        int udp_fd=fd;
        int broadcast_en=1;
        char msg_buf[SND_BUF_LEN];
        char *use="test",*group="sunplusapp";
        socklen_t broadcast_len=sizeof(broadcast_en);
        long int msg_id=time((time_t *)NULL);
        struct sockaddr_in udp_addr;
        struct sockaddr client;
        bzero(msg_buf,SND_BUF_LEN);
        bzero(&udp_addr,sizeof(struct sockaddr_in));
        udp_addr.sin_family=AF_INET;
        udp_addr.sin_port=htons(IPMSG_UDP_PORT);
        inet_pton(AF_INET,BR_IP,&udp_addr.sin_addr.s_addr);

    //下边的if 与else if :对于上线通告 下线等使用广播地址,其他的则否
        if( (p==NULL)&&(mode!=IPMSG_NOOPERATION)&&(mode!=IPMSG_BR_ENTRY)&&(mode!=IPMSG_BR_EXIT))
        {
            printf("p is NULL,only mode = IPMSG_NOOPERATICNA IPMSG_BR_ENTRY IPMSG_EXIT is allowed p=NULL \n");
            return 1;
        }
        else if( (p!=NULL)&&(mode!=IPMSG_NOOPERATION)&&(mode!=IPMSG_BR_ENTRY)&&(mode!=IPMSG_BR_EXIT))
            client=*p;

    //打开广播
        if( setsockopt(udp_fd,SOL_SOCKET,SO_BROADCAST,&broadcast_en,broadcast_len)<0 )
        {
            perror("setsockopt error");
            exit(1);
        }
        switch (mode)
        {
            case IPMSG_NOOPERATION:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,NULL);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,(struct sockaddr *)&udp_addr,sizeof(struct sockaddr));
            break;
            case IPMSG_BR_ENTRY:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,(struct sockaddr *)&udp_addr,sizeof(struct sockaddr));
            break;
            case IPMSG_BR_EXIT:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,(struct sockaddr *)&udp_addr,sizeof(struct sockaddr));
            break;
            case IPMSG_ANSENTRY:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,&client,sizeof(struct sockaddr));
            break;
            case IPMSG_SENDMSG:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,&client,sizeof(struct sockaddr));
            break;
            case IPMSG_SENDMSG_OPT:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,&client,sizeof(struct sockaddr));
            break;
            case IPMSG_RECVMSG:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,&client,sizeof(struct sockaddr));
            break;
            case IPMSG_GETFILEDATA:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,&client,sizeof(struct sockaddr));
            break;
            case IPMSG_RELEASEFILES:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,&client,sizeof(struct sockaddr));
            break;
            case IPMSG_GETDIRFILES:
            sprintf(msg_buf,"1:%d:%s:%s:%d:%s",msg_id,use,group,mode,msg);
            sendto(udp_fd,msg_buf,strlen(msg_buf),0,&client,sizeof(struct sockaddr));
            break;
            default:
            printf("no match mode !\n");
            break;
        }
        broadcast_en=0;

    //  关掉广播
        if( setsockopt(udp_fd,SOL_SOCKET,SO_BROADCAST,&broadcast_en,broadcast_len)<0 )
        {
            perror("setsockopt error");
            exit(1);
        }
        printf("msg send ok ! \n");
        return 0;
    }    

    通过上边的报文就可以实现消息的传递,可以发起文件、文件夹的传输,传输文件时,首先需要通过UDP报文联络,在UDP报文联络好之后,随即发起TCP文件传输,文件传输是不带格式的。IPMSG的一个难点就是文件夹的传输。今天就写这里,而却也做到这里。





    展开全文
  • Linux 下飞鸽传书设计实现1、系统功能根据飞鸽传书协议在 linux 下实现飞鸽传输程序,并且与 windows 下飞鸽兼容。具体功能模块包括用户上线,下线,刷新查看在线用户,收发消息,传送文件/文件夹功能模块。2、具体实现2...

    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下网络编程,多线程编程及线程间通信(主要用到信号量与互斥锁)。但加密解密那块没有完成,程序结构不是很好,界面做得太差。有空应该看看设计模式.

    https://www.cnblogs.com/hnrainll/category/297419.html

    展开全文
  • 协议声明: 本协议是由日本人Shirouzu Hiroaki (白水 启章)先生编写。 wanpengcoder翻译于Mr.Kanazawa英文文档,转载请注明出处。 ...
  • 本课题设计主要针对局域网通讯而开发设计的,采用的是C/S构架,类似飞鸽传书系统,来实现聊天、文件传输功能,并借助一些网络通讯组件,成功的实现了在局域网上的即时通讯。 本论文的目标是设计一个类似飞鸽传输的...
  • 飞鸽传书 v5.1.161212.zip

    2019-07-17 07:08:03
    飞鸽传书是一款专业好用的局域网即时通讯软件。软件基于TCP/IP(UDP),主要针对企业办公设计,学校、家庭也可使用,支持PC、手机、平板电脑文字、文件、文件夹互传,具有即装即用、传输快捷的特点,还具有远程桌面...
  • 信使(iptux):Linux下的飞鸽传书不知你是否使用过“飞鸽传书”这款Windows软件?“哇,对着Linux用户问这个问题,不是很无聊吗?...—–iptux是一款由国人开发的,基于GTK+2,兼容“飞鸽传书协议的局域...
  • 推荐!局域网通信源码 C++飞鸽传书服务器客户端源码及传输协议 服务器源码 客户端源码 传输协议源码 C++写的 可以参考学习 CLeopard 2012/01/07
  • 飞鸽传书项目

    2019-09-15 12:59:20
    飞鸽传书 1. 介绍 古代通讯 飞鸽传书与鸿雁传书是一个意思,就是古人之间联系的一种方法,将信件系在鸽子的脚上然后传递给要传递的人。古代通信不方便,所以聪明的人利用鸽子会飞且飞得比较快、会辨认方向等多...
  • 本软件是集合信息聊天,文件传输,语音呼叫,用于局域网的手机通讯工具,类似飞鸽传书。完全可以编译,运行!有完整注释!   注意:手机通过wifi连入局域网 本软件设计的以下知识点理解不算太难! 1、短信息:...
  • 用C# 做的飞鸽传书 实现了消息的收发 遵循Messenger协议
  • 基于Ubuntu版本的Linux系统,用C++编写的Qt局域网聊天软件。网络通信方式类似飞哥传书。好东西分享给需要的人。
  • 飞秋(FeiQ) V2.4┊局域网聊天传送文件_兼有飞鸽传书协议┊简体中文绿色修正版.rar
  • IP Messenger 是由日本人Shirouzu Hiroaki开发的一款小巧、极速、免费和开放源代码的多平台弹出式局域网即时通信软件,基于TCP/IP(UDP)协议,无需服务器。支持文件/文件夹传输,支持捕获指定区域的图像,支持在消息...
  • 飞鸽传书【经典版】(飞鸽传书2011)
  • //=============================================================// 文件名称:usrlist.c// 功能描述:通用链表修改成的myUsrList链表, **注释**部分为要注意修改的地方////////包含文件:usrlist.h lnklst.h// ...
  • 该源码实现了一款不错的飞鸽传书应用,应用采用飞鸽传书协议来实现的,目前只完成了飞鸽传书协议中的最基本的功能:上下线功能,聊天功能和文件传输功能等,喜欢的朋友可以下载研究一下。可以进行二次开发等。。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 895
精华内容 358
关键字:

飞鸽传书协议

友情链接: TempatureC51.zip