飞鸽传书linux运行,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下网络编程,多线程编程及线程间通信(主要用到信号量与互斥锁)。但加密解密那块没有完成,程序结构不是很好,界面做得太差。有空应该看看设计模式.
界面截图(界面比较垃圾):
附:
飞鸽协议: http://bbs.chinaunix.net/viewthread.php?tid=1015775
posted on 2011-03-15 21:57 周强 阅读(1240) 评论(0) 编辑 收藏 引用 所属分类: linux 、网络编程
飞鸽传书linux运行,Linux下飞鸽传书实现相关推荐
- 飞鸽传书linux运行,Linux下如何安装IPtux飞鸽传书
习惯了在Windows系统中使用飞鸽传书的童鞋们,对于突然在使用Linux时在局域网下传输文件.即时通讯等,可能突然感觉束手无策. 下面就针对Linux下安装iptux(飞鸽传书)进行安装和使用的说明 ...
- asf如何在linux运行,linux环境下使用mono运行asf挂卡
杰瑞包大好评啊,但是带来的后果就是挂卡挂不完了.然而手里的服务器全是linux环境的并不支持C#写的ASF,所以用mono f**k之. Ubuntu篇 接下来介绍如何安装mono,以Ubuntu 1 ...
- asf如何在linux运行,Linux下使用ASF工具Steam挂卡的配置使用
Linux下使用ASF工具 Steam 挂卡的配置使用 简介 既然你都费钱买了游玩,为甚么还要花时间玩呢?这款工具便可以不用下载游玩,主动挂卡,是Steam回血渠道之一.(慈悲包) 1.部署 .Net ...
- 单进程程序怎样在linux运行,linux下C程序:运行单个实例
对于很多服务来说,在同一个服务器上只能运行一个实例,那么通过什么方法来保证程序同一时刻只有一个实例运行呢?通过编写shell脚本来管理程序的启动.停止是个不错的方法.在启动时,shell脚本会创建进程 ...
- pydev工程linux运行,Linux平台下Python的安装及IDE开发环境搭建
转自http://blog.csdn.net/guoxiaojie_415/article/details/48108319 1.Python安装 Python有2.X和3.X两个版本,由于2.X的版 ...
- jperf linux运行,Linux网络性能评估工具iperf
Iperf介绍 iperf是一个基于TCP/IP和UDP/IP的网络性能测试工具,用于检测网络带宽使用率和网络质量,能测试最大TCP和UDP带宽性能,可以报告带宽.网络延迟抖动.数据包丢失率和最大传输 ...
- Linux下飞鸽传书项目设计书,Linux 下飞鸽传书设计实现
Linux 下飞鸽传书设计实现 1.系统功能 根据飞鸽传书协议在 linux 下实现飞鸽传输程序,并且与 windows 下飞鸽兼容.具体功能模块包括用户上线,下线,刷新查看在线用户,收发消息,传送文 ...
- 1连接远程linux,2配置linux,3在linux运行pyhon
前两天有大神帮我部署Linux,据说可以连接到自己电脑上,我对于那些东西,自己一点也不了解,还好有大神帮我步骤 一开始的时候,大神在他网站帮我加载了很多的文件 然后我的Linux变得很好看 然后分别帮 ...
- 飞鸽传书如何在VMware下进行通信
飞鸽传书如何在VMware下进行通信?VMware Workstation是一款功能强大的虚拟机软件,可以使你在一台机器上同时运行二个或更多Windows.DOS.LINUX系统,并进行开发.测试.部 ...
- linux实训项目——飞鸽(一)
目前完成UDP广播上线.用户间对话功能. 目录 目录 前言 一.基础知识 二."飞鸽"运行流程 1.用户运行程序后先设置用户名,即上线后别人看到的名字. 2.上线后进行UDP广播, ...
最新文章
- 最难忘的一天----一周年记
- 与MYSQL的零距离接触(数据类型) 慕课网
- Java项目导出源代码jar包在Eclipse中查看中文注释乱码的问题
- pthread_join和pthread_detach详解
- c#和c++的opencv位图数据参数互换问题解决方法
- tensorboard : 无法将“tensorboard”项识别为 cmdlet、函数、脚本文件或可运行 程序的名称。
- P4389 付公主的背包(生成函数,多项式exp)
- 使用Span T 提高C#代码的性能
- C语言-排序-希尔排序
- php oracle 存储过程 返回值,PHP 调用 Oracle 存储过程 之 查询
- 目标检测网络 -- FasterRCNN
- 第一台电子计算机乌拉尔,2018网易爱乐之战题目答案大全一览
- 【渝粤教育】广东开放大学 动画运动规律 形成性考核 (25)
- SlideLive网站:提供PPT模板在线播放和免费下载的功能
- ABP Vnext 扩展微信小程序授权登录
- mqtt publish 中文
- 解决 “您必须首先安装.NETFramework的以下版本“
- html手机端自适应头部,html5写自适应头部
- 2012.3积累点滴
- vscode的颜色设置(护眼模式)