IPMSG飞鸽传书5——网络协议解析手记1

相信很多人都使用过飞鸽传书,这个小工具在局域网传输数据高效而便捷,自己在大二的时候就想看看飞鸽传书的源码,但那时候自己的水平有限,这几天有机会重写飞鸽传书,也对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最为重要的内容。



# ifndef IPMSG_H
# define IPMSG_H



# define GET_MODE( command)     ( command & 0x000000ffUL)
# define GET_OPT( command)     ( command & 0xffffff00UL)


# define IPMSG_VERSION             0x0001
# define IPMSG_DEFAULT_PORT         0x0979


# 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


# define IPMSG_ABSENCEOPT         0x00000100UL
# define IPMSG_SERVEROPT             0x00000200UL
# define IPMSG_DIALUPOPT             0x00010000UL
# define IPMSG_FILEATTACHOPT         0x00200000UL


# 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         

报文中的命令字是一个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;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值