|
一、 IPMSG通信协议介绍 声明:下述协议内容略去了一些本程序中没有用到协议内容,最初的Ipmsg协议是用日文写的,下面协议内容由本人翻译自Mr.Kanazawa的英文文档。 IP信使传输协议(第9版草案) 1996/02/21 2003/01/14 修订 H.Shirouzu shirouzu@h.email.ne.jp 关于IP信使: IP信使使用TCP/UDP协议提供收发消息及文件(目录)。 特性: IP信使能够安装在任何一个安装了TCP/IP协议栈的操作系统上,使用在线用户的动态识别机制,可以和在线所有用户进行信息交换。 运行机制介绍: 使用TCP/UDP端口(默认端口为2425),消息的收发使用UDP协议,文件(文件夹)的收发使用TCP协议。 1、 命令字: 1) 基本命令字(32位命令字的低8位) IPMSG_NOOPERATION 不进行任何操作 IPMSG_BR_ENTRY 用户上线 IPMSG_BR_EXIT 用户退出 IPMSG_ANSENTRY 通报在线 IPMSG_SENDMSG 发送消息 IPMSG_RECVMSG 通报收到消息 IPMSG_GETFILEDATA 请求通过TCP传输文件 IPMSG_RELEASEFILES 停止接收文件 IPMSG_GETDIRFILES 请求传输文件夹 2) 选项位(32位命令字的高24位) IPMSG_SENDCHECKOPT 传送检查(需要对方返回确认信息) IPMSG_FILEATTACHOPT 传送文件选项 3) 附件类型命令(文件类型命令字的低8位) IPMSG_FILE_REGULAR 普通文件 IPMSG_FILE_DIR 目录文件 IPMSG_FILE_RETPARENT 返回上一级目录 2、 数据包格式(使用字符串): 1) 数据包格式(版本1的格式) 版本号(1):包编号:发送者姓名:发送者主机名:命令字:附加信息 2) 举例如下 “1:100:shirouzu:Jupiter:32:Hello” 3、 数据包处理总述: 1) 用户识别 当IPMSG启动时,命令IPMSG_BR_ENTRY被广播到网络中,向所有在线的用户提示一个新用户的到达(即表示“我来了”);所有在线用户将把该新上线用户添加到自己的用户列表中,并向该新上线用户发送IPMSG_ANSENTRY命令(即表示“我在线”);该新上线用户接收到IPMSG_ANSENTRY命令后即将在线用户添加到自己的用户列表中。 2) 收发消息 使用IPMSG_SENDMSG命令发送消息,消息内容添加在附加信息中;在接收消息时,如果对方要求回信确认(IPMSG_SENDCHECKOPT位打开),则需发送IPMSG_RECVMSG命令并将对方发送的数据包的编号放在附加信息中一同发送至发送消息方 3) 附加文件的扩充(添加于第9版) 带有IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG命令可用来传输文件,文件属性及内容添加在附加信息中,文件内容添加在消息内容后并以’/0’与之分隔开。传输文件时以下信息将被添加到消息内容之后(包括格式):文件序号:文件名:大小(单位:字节):最后修改时间:文件属性[:附加属性=val1[,val2…][:附加信息=…]]:/a:文件序号… (文件大小、最后修改时间和文件属性为十六进制数,如果文件名中包含’:’则使用“::”代替)。 接收端开始接收文件时,请求传输文件命令IPMSG_GETFILEDATA将发送到发送端的TCP端口(和UDP的发送端口相同),并将发送端发送的包编号:文件序号:偏移量(全为十六进制格式)写到附加信息区一同发送,文件发送端接收到该请求信息并进行校验正确后即开始发送文件(不使用任何格式,亦不进行加密)。 当接收端接收到目录文件时,将发送附加信息区为发送端发送的包编号:文件序号:偏移量(全为十六进制格式)的IPMSG_GETDIRFILES命令,以用来请求传输目录文件;发送端则将头信息长度:文件名:文件大小:文件属性:文件内容添加到附加信息区(除了文件名和文件内容外,其余皆为十六进制),头信息长度是从头信息长度开始到文件内容前的‘:’分割符为止的字符个数。 当文件属性为IPMSG_FILE_DIR时,IPMsg能够自动识别其为目录,下一个文件的数据在该目录之后。 当文件属性为IPMSG_FILE_RETPARENT时,IPMsg识别其动作为返回上一级目录,在这种情况下,文件名为‘.’其属性为当前目录的值。 到此本程序所用到的协议已经叙述完毕,由于实现的功能较简单,故删减了一些原IPMSG协议的内容,完整的IPMSG协议请参照如下网址: http://linuxopen.cugb.edu.cn/Forum/read.php?tid=283 二、 程序实现(Linux下的socket编程) 程序源代码请到 http://linuxopen.cugb.edu.cn/Forum/read.php?tid=453下载,下面简要叙述一下程序设计结构和实现 1、数据结构定义 1) 在线用户信息数据结构,用于存放在线用户信息,并组成用户列表(使用双向链表实现) typedef struct ipmsguser { int user_num; /*在线用户编号*/ struct sockaddr_in user_addr; char user_name[MAX_USER_NAME_LENGTH]; char user_group[MAX_USER_GROUP_LENGTH]; char user_machine[HOSTNAME_LENGTH]; char append[MAXSOCKBUF]; char user_nick[MAX_USER_NAME_LENGTH]; struct ipmsguser * next; struct ipmsguser * pre; }ipmsg_user_list; 2) 发送的UDP数据包结构(按照数据包格式设计) typedef struct ipmsgdata { int version; unsigned int packetno; char sendername[MAX_USER_NAME_LENGTH]; char *ip; char senderhost[HOSTNAME_LENGTH]; unsigned int com; char append[MAX_APPEND_LEN]; char sendfileheader[MAX_SEND_FILE_HEADER_LEN]; }ipmsgdata; 3) 传输文件的首部信息结构(按照文件传输协议定义) typedef struct transfileheader { unsigned int fileID; char filename[PATH_MAX]; unsigned long long size; unsigned int mtime; unsigned long fileattr; }transfileheader; 4) 传输目录的首部信息结构(按照目录传输协议定义) typedef struct transfolderheader { int headersize; char filename[PATH_MAX]; unsigned long long filesize; unsigned long fileattr; time_t filemtime; //文件/文件夹的修改和创建时间 time_t filectime; }transfolderheader; 5) 发送多个文件/目录时用于记录信息的结构(用于向发送文件/目录线程传送的参数) typedef struct sendfilearg { int filenum; int flags; /*flags用来记录发送到的目的地的形式:1为序号,2为all,3为IP,4为用户名*/ char filename[MAXFILESEND][PATH_MAX]; //文件/文件夹名 unsigned long fileattr[MAXFILESEND]; /*发送的文件的属性,为标志量,*为0时表示对应的文件名为文件,为1表示对应为目录*/ char to[20]; //目的地 }sendfilearg; 2、函数说明 int command(char *cmd);//处理用户输入的命令 void ipmsgswitch(ipmsgdata * data, char * buff);//解析接收到UDP数据 void ipmsgsendbcast(struct sockaddr_in *dest, unsigned int com, ipmsgdata *data);//发送UDP数据 ipmsg_user_list *adduser(struct sockaddr_in *useraddrs, struct ipmsguser *q, ipmsgdata *data);//添加用户于用户列表 char user_exist(struct sockaddr_in *useraddr, ipmsgdata *data); //判断用户是否存在于用户列表 void *watch_net(void *arg); //监控网络线程的回调函数,用于接收UDP数据 void del_user(struct sockaddr_in *useraddr, ipmsgdata *data);//删除用户 void del_all_user();//清空用户列表 ipmsg_user_list *search_user(int *usernum, struct in_addr *useraddr, char *username);//查找某个用户于用户列表 void *getfiles(void *arg);//接收文件/目录线程的回调函数 void *sendfiles(void *arg);//发送文件/目录线程的回调函数 int senddir(char dir[], int socksendfd);//遍历目录树并通过TCP发送目录内容 3、总体设计 使用多线程编程技术,一个线程监控网络,用来实时更新用户列表和显示消息;一个线程用来和用户交互,处理用户输入的命令;当接收文件时还会生成一个线程,用于接收文件/目录并存盘;当发送文件/目录时也会生成一个线程,用于发送文件/目录;这就是多线程的好处,可以并行的完成几件事情。在使用多线程编写网络程序时,尤其要注意线程同步问题以及TCP和UDP协议的性质(即TCP为流式协议,UDP为用户数据报协议)。 4、 细节方面的简要说明 在编写网络程序时,处理字符串是经常碰到的问题,TCP流式协议的特性亦应引起高度重视,不过只要记住这一点,以后在这方面就不会遇到大麻烦,现介绍一下TCP协议的特性,首先TCP协议发送的是字符流,一个TCP包的长度不定,最大为程序员指定的大小,最小可能为0,而且应用层使用send发送的数据可能被内核重新装备再进行发送,所以可能出现这样的情况:多个send语句发送的内容组成了一个TCP包发送给对方,而recv语句则可能接收到0长度的数据,所以在处理接收到数据时应谨慎对待,因为每次recv到的数据并不是想象中的数据长度和数据格式,很可能错位,所以程序需要对数据进行全面的分析。 网络程序很多都使用多线程实现,因为线程只独立拥有栈空间共享堆空间,所以在使用库函数或系统调用时尤其要注意使用的函数是否是线程安全的,如果不是线程安全的,请使用对应的线程安全的函数或自己编写完成同样功能的线程安全的函数。这里介绍两个非线程安全的函数,他们在编写多进程程序时是可以安全的使用的:readdir、strtok,其中readdir为Linux/Unix的系统调用,strtok为标准C库函数,这两个函数都使用了静态变量(由static修饰),故为非线程安全的,而进程拥有独立的堆空间和独立的栈空间,故对进程而言他们是安全的,对应于readdir的线程安全函数为readdir_r,其为POSIX标准函数,在绝大多数UNIX/Linux系统上都可以使用,对应于strtok的线程安全函数我没有找到,但我根据strtok的glibc的实现自己写了个线程安全的函数(mystrtok),其取消对静态变量的依赖,故为线程安全的。 还有就是开发网络程序,特别需要注意的是编写安全的网络程序,写的网络程序不要成为对方攻击的目标,这里要提醒注意的是在使用一些容易引起内存溢出的函数时需要考虑是否有其他函数(不会引起溢出的)可用呢?这里列举几个,提起大家的注意,sprintf、strcpy、strcat这三个函数由于在操作时不检查是否越界,所以请考虑使用snprintf、strncpy、strncat代替之。 5、 有待改进的地方 还有很多地方有待改进,win版的IPMSG的功能还有很多,其命令字亦有不少,这里只使用其中较少的几个,主要是为了完成文件/目录的收发功能,而且程序肯定还有很多bug,尚需时日进行调试,这次发布的只是版本1,以后还会有版本2、版本3。 Linux下的IPMSG实现就介绍到这儿,具体代码请到论坛下载,如遇问题请回帖指出,如有不同意见欢迎交流。 |
相关推荐
Linux下实现局域网即时通讯的IPMSG
IPMSG是一种免费的即时通讯软件,广泛应用于企业与个人的交流中。它支持文本消息、文件传输、语音视频通话等多种通讯方式,具有跨平台、低成本、操作简便的特点。不仅如此,IPMSG还支持二次开发,为用户提供了灵活的扩展性和可定制性,以满足不同用户群的特定需求。无论你是初学者还是资深IT专家,IPMSG都能提供稳定高效的服务。
linux下基于ipmsg协议的飞鸽传书(一)
运行机制介绍:使用TCP/UDP端口(默认端口为2425),消息的收发使用UDP协议,文件(文件夹)的收发使用TCP协议。(文件传输部分待续....) 主函数:创建线程实现,聊天、用户上线、下线、文件传送 //===================================================================================
linux平台下的飞鸽(IPMsg) 源代码.
linux平台下的飞鸽,IPMsg,实现了基本的功能: 发送接受消息,发送接收文件等.
[ubuntu]IPMSG在ubuntu linux上的安装
经常要到windows上传些文件。总感觉samba用起来太麻烦了。速度也不快。还是怀念windws的ipmsg啊。呵呵。由于ipmsg是开源的。到官网一看。果然有源代码。于是乎下载下来手动安装。1,下载源代码: sudo wget http://www.ipmsg.org/archive/g2ipmsg-0.9.5.tar.gz2, 解包: tar xzvf g2ipmsg-0.
ipmsg for linux
ipmsg for linux, 用于在linux下局域网通信.
Linux下的飞鸽传书源码(ipmsg、聊天、文件传输)
在utf8和gbk的环境中,支持中文聊天及中文文件名
局域网分享工具:python重新实现ipmsg协议
py_ipmsg 开源项目地址: gitee。 注意: 目前项目还不完善,正在开发阶段。如果造成经济和数据损失,个人不承担任何责任,请妥善选择与使用。 项目描述: 由于linux环境下的iptux项目不太友好,并且代码结构不便于优化,个人使用python重新实现ipmsg协议. 方便后期修改和优化. 项目开发: 参考: 传输协议实现参考: github 项目 ipmsg 中文协议参考:IPmsg(飞鸽传书)协议翻译 欢迎大家参考和使用. ...
SOC-ATF 安全启动BL2流程分析(2)
Bl2的启动流程与bl1类似,主要区别是bl2的初始化流程比bl1更简单,但其可能需要加载更多的镜像,如bl31、bl32和bl33。由于bl2可以运行于el3或s-el1,它们的入口函数和处理流程都有所区别,为了简化分析我们选取比较常见的s-el1方式,以下为其总体执行流程:上图仅供参考,实际看一下代码结构:上面截图展示了 链接汇编文件,bl2_el3.ld.S 是指bl2 运行于el3;bl2.ld.S 是实现bl2运行于s-el1 .
飞鸽传书(IPMsg)之linux mint安装
这两天在折腾linux mint,因为自己的Windows系统上安装了飞秋,使用的是飞鸽传书(IPMsg)的通讯协议,搜了搜,发现linux下有个叫iptux的软件,二话不说,开始安装: sudo apt-get install iptux 安装完成后,在互联网里多了一个快捷方式 “信使(iptux)"。
2016域控服务器迁移,WIN Server2016 域服务器迁移出错
各位大神: 这几天刚安装了一台windows server 2016做域迁移时出现错误:1、默认SYSLOG、NETLOGON共享文件重启后自动取消共享,即使手动打开后依然会出现自动取消2、组策略中编辑策略时出现以下报错 policys.png (19.29 KB)2017-2-7 13:52操作此动作之前可以访问本机的共享(NETLOGON)3、使用DCDIAG检测多个报错:C:\Use...
dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行
dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行
Linux下安装飞鸽传书
<br />转自 http://hi.baidu.com/dxjinf/blog/item/79be36515504e32042a75b97.html<br /> 在Linux下使用ipmsg(飞鸽传书)<br /><br /> ipmsg是个不错的局域网通讯软件,非常小巧,无需服务器端,使用非常方便。<br /><br /> 在Linux下使用需要自行编译。<br /><br /> 在官方网站下载源码:http://www.ipmsg.org/index.html.en (http://www.
契约锁代码审计分析
但是正常来讲,定义了这么多的路由,肯定会有一个通用的判断逻辑,来判断请求的url是否和这些路由匹配。POC中有一点值得注意,Spring新一些的版本中支持以表单的形式来为参数赋值,且无需用注解。但是需要注意4.2.8的代码逻辑和新版本中的不同,此漏洞可能存在于版本大于4.2.8的版本中。方法用于解析LICENSE,先进行AES解密,再从字符串转换成json格式的License。loadPath实际判断传入的path是否和下面的path相等,如果不相等返回null。,如果包含这三个中的一个就会抛出异常。
linux feiq
飞秋 linux IP Messenger This is a pop up style LAN Messenger for multi platforms. It is based on TCP/IP(UDP). It does not require server machine. Simple, lightweight, and compact size. linux下安装f
KEGG数据库与KAAS工具:基因功能注释的实用指南
本文提供了使用KEGG数据库与KAAS工具进行基因功能注释的完整实用指南。详细阐述了如何从准备基因或蛋白序列开始,通过KAAS服务器获取KEGG Orthology(KO)编号,并解读注释结果。文章进一步介绍了如何利用KOBAS工具进行通路富集分析,将定性观察转化为定量洞察,并分享了提高注释准确率、处理大数据集及使用API等避坑技巧与高阶方法,为基因组学、转录组学研究者奠定坚实的数据分析基础。
Cadence PSpice 仿真0:绘制电路图方法图文教程
在使用PSpice进行电路的仿真时,首先需要使用带有PSpice模型的元器件来绘制电路图,本文简单介绍进行电路图绘制是常用的几种需要掌握的方法,以满足PSpice仿真绘制简单电路图所用。
Linux(使用了Ubuntu)和windows传输和共享文件的方法总结
一、使用飞鸽传书实现功能 目前在linux下使用飞鸽传书的比较流行的软件有iptux和ipmsg。 1.1 iptux iptux是ubuntu中一个可以和windows下大家熟悉的飞鸽传书互传文件的软件,在ubuntu软件中心中可以找安装。个人体验还不错,传输速度15M/s左右,(在ubuntu中互传速度能更好)兼容windows下的各种飞鸽传书版 本。 安装ipt
bash: huggingface-cli: command not found... 解决方案
本文主要介绍了bash: huggingface-cli: command not found… 解决方案,希望能对使用大模型的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案
X61 Slackware的配置9
作者: forever steel(zhoun) 原发: http://guo9310.blog.163.com/ 系统配置基本完成了, 下面就是一些关于软件使用的问题了 1. java开发环境 ??? 因为java的跨平台性质, 所以安装Java的东西很简单. Slackware安装的时候就带了JRE 1.6.0_02-b05, 如果开发要用JDK, slackware-current/e...
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
64位ubuntu安装feiq
linux下安装feiq的方法 在windows和linux文件的传送,突然想到这种方法。仅供参考: 安装飞鸽传书(ipmsg) 下载for gnome2版本的源 http://www.ipmsg.org/archive/g2ipmsg-0.9.6.tar.gz 2、解压 在ubuntu中用命令行 tar xzvf g2ipmsg-0.9.5.tar.gz,或者菜单右键用归档管理器解压...
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
OE_飞鸽传书_局域网中的利器
在组件局域小组协同办公,而且需要快捷传书文件时,飞鸽传书是非常方便快捷方便的工具。其中,windows中安装飞秋(飞鸽传书)是非常方便的,Ubuntu 22.04 上主要有两种方案:安装兼容飞秋协议的 iptux (推荐),或用 Wine 运行 Windows 版飞秋。
霍尼韦尔SoftMaster使用说明
霍尼韦尔SoftMaster使用说明
在Linux下使用ipmsg(飞鸽传书)
在Linux下使用ipmsg(飞鸽传书)ipmsg是个不错的局域网通讯软件,非常小巧,无需服务器端,使用非常方便。在Linux下使用需要自行编译。在官方网站下载源码:http://www.ipmsg.org/index.html.en(http://www.ipmsg.org/archive/g2ipmsg-0.9.5.tar.gz)解压后需要修改源码以支持中文:文件:src/codeset.c原...
ubuntu下安装IPMSG
Ipmsg是个不错的局域网通讯软件,非常小巧,无需服务器端,使用非常方便。 在Linux下使用需要自行编译。 在官方网站下载源码:http://www.ipmsg.org/index.html.en 解压到你想要的目录,用终端进入IPMSG根目录, sudo gedit ./configure 打开文件,将所有 CP932 替换成 C
1362



被折叠的 条评论
为什么被折叠?



