IPMSG飞鸽传书5——网络协议解析手记1
来源:互联网 发布:400选号平台 源码 编辑:程序博客网 时间:2024/05/17 21:55
相信很多人都使用过飞鸽传书,这个小工具在局域网传输数据高效而便捷,自己在大二的时候就想看看飞鸽传书的源码,但那时候自己的水平有限,这几天有机会重写飞鸽传书,也对IPMSG的网络协议做了深入的研究,这里也要感谢IPMSG的作者公开源代码。
首先需要明确IPMSG的主要功能,IPMSG可以局域网通信、传输文件、传输文件夹,可以通过添加局域网外IP来实现网外的聊天与文件传输功能。我们先分析下IPMSG的聊天功能,IPMSG通过UDP协议实现聊天,当一个IPMSG的客户端运行开始,首先它向整个局域网广播上线报文,局域网内的其他IPMSG客户端收到上线报文后,回复该报文,回复报文中包含了该客户端的IPPORT 用户名机器名。这样在上线客户端通过广播发送上线报文后,局域网内的其他所有IPMSG客户端都发送一个回复报文,这样,所有IPMSG的客户端都更新自己的在线用户列表。这样IPMSG的上线就算结束了,接下来,如果有客户端发送消息,而消息是通过UDP来完成的,客户端通过查询自己用户链表获取其他用户的网络地址信息,发送消息给其他用户。总结一下:
ipmsg可以用于收发消息和文件(夹)
使用UDP协议收发消息使用TCP协议收发文件(夹)
默认使用2425端口做数据传输(TCP/UDP)
包含以下功能
用户上下线识别
消息收发
文件传输文件夹传输
IPMSG的报文格式:版本号:包编号:发送者姓名:发送者主机名:命令字:附加信息
整个报文通过字符串的形式发送,IPMSG的版本号为1,而包编号必须是不重复的数字,这里可以是用比较简洁的方式,就是通过linux的库函数timer来完成,time函数返回从1970 年1 月1 日0点以来的秒数.所以每个运行timer()的结果都是不一样的,可以放心使用。报文中的命令字是指明这个报文是消息、上线通告、传输文件、传输文件夹还是其他的东西,附加信息在不同的命令字下是不一样的,如果命令字是消息,那么附加信息就是消息内容,如果命令字是传输文件,那么附加信息就是文件的信息了,我们来看一下命令字,这是IPMSG最为重要的内容。
#ifndef IPMSG_H
#define IPMSG_H
#define GET_MODE(command) (command&0x000000ffUL)
#define GET_OPT(command) (command&0xffffff00UL)
#defineIPMSG_VERSION 0x0001
#defineIPMSG_DEFAULT_PORT 0x0979
#defineIPMSG_NOOPERATION 0x00000000UL
#defineIPMSG_BR_ENTRY 0x00000001UL
#defineIPMSG_BR_EXIT 0x00000002UL
#defineIPMSG_ANSENTRY 0x00000003UL
#defineIPMSG_BR_ABSENCE 0x00000004UL
#defineIPMSG_BR_ISGETLIST 0x00000010UL
#defineIPMSG_OKGETLIST 0x00000011UL
#defineIPMSG_GETLIST 0x00000012UL
#defineIPMSG_ANSLIST 0x00000013UL
#defineIPMSG_FILE_MTIME 0x00000014UL
#defineIPMSG_FILE_CREATETIME 0x00000016UL
#defineIPMSG_BR_ISGETLIST2 0x00000018UL
#defineIPMSG_SENDMSG 0x00000020UL
#defineIPMSG_RECVMSG 0x00000021UL
#defineIPMSG_READMSG 0x00000030UL
#defineIPMSG_DELMSG 0x00000031UL
#defineIPMSG_ABSENCEOPT 0x00000100UL
#defineIPMSG_SERVEROPT 0x00000200UL
#defineIPMSG_DIALUPOPT 0x00010000UL
#defineIPMSG_FILEATTACHOPT 0x00200000UL
#defineIPMSG_FILE_REGULAR 0x00000001UL
#defineIPMSG_FILE_DIR 0x00000002UL
#defineIPMSG_LISTGET_TIMER 0x0104
#defineIPMSG_LISTGETRETRY_TIMER 0x0105
#defineHS_TOOLS "HSTools"
#defineIP_MSG "IPMsg"
#defineNO_NAME "no_name"
#defineURL_STR "://"
#defineMAILTO_STR "mailto:"
#endif
报文中的命令字是一个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飞鸽传书5——网络协议解析手记1
- IPMSG飞鸽传书5——网络协议解析手记2
- IPMsg飞鸽传书网络协议解析手记
- IPMsg飞鸽传书网络协议解析手记
- IPMsg飞鸽传书网络协议解析手记
- IPMsg飞鸽传书网络协议解析手记
- IPMsg飞鸽传书网络协议解析手记
- IPMsg飞鸽传书网络协议
- IPMSG飞鸽传书3——协议翻译
- IPMSG飞鸽传书3——协议翻译
- IPMSG(飞鸽传书)协议翻译
- IPMSG(飞鸽传书)协议翻译
- IPMSG(飞鸽传书)协议翻译
- IPMSG(飞鸽传书)协议翻译
- IPMSG(飞鸽传书)协议翻译
- IPMSG(飞鸽传书)协议翻译
- IPMsg飞鸽传书--文件传输解析
- IPMSG飞鸽传书1——编译源代码的方法
- Java JDBC编程总结
- IPMSG飞鸽传书1——编译源代码的方法
- IPMSG飞鸽传书2——关于对话框
- IPMSG飞鸽传书3——协议翻译
- IPMSG飞鸽传书4——App类
- IPMSG飞鸽传书5——网络协议解析手记1
- IPMSG飞鸽传书5——网络协议解析手记2
- IPMSG飞鸽传书6--文件传输解析
- IPMSG飞鸽传书7——文件发送源码分析
- Verilog 【以下的语句我基本没怎么懂,在上篇里。故记下,虽然没什么逻辑,但是可以帮助我再看下去】
- centos 和 ubuntu 下单网卡设置多个IP
- 一上午过去了。
- Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本
- mciSendString参数 摘录