IPMSG相关知识点

1.使用TCP/UDP端口(默认端口为2425),消息的收发使用UDP协议,文件(文件夹)的收发使用TCP协议。
2.有一点可以确定.命令字和选项位可以唯一的确定一个编码.应该还是以命令字为主.
3.使用IPMSG_SENDMSG命令发送消息,消息内容添加在附加信息中;在接收消息时,如果对方要求回信确认(IPMSG_SENDCHECKOPT位打开),则需
发送IPMSG_RECVMSG命令并将对方发送的数据包的编号放在附加信息中一同发送至发送消息方.
4.带有IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG命令可用来传输文件,文件属性及内容添加在附加信息中,文件内容添加在消息内容后并以’\0
’与之分隔开。
5.在传输文件时,文件大小、最后修改时间和文件属性为十六进制数,如果文件名中包含’:’则使用“::”代替.
6.IPmsg UDP数据包格式:
1 程序版本号
2 数据包序列号
3 用户名
4 主机名
5 命令
6 消息内容
7 额外数据
1到5的内容是以“:”为分隔符,消息和额外数据以数据“
0“分隔.(字符0).
7.IPmsg发送文件的整个逻辑过程:
1.发送端发送一个UDP数据包,通知接收端准备接收文件,通知在一个socket上监听TCP连接事件
2.接收端回发一个UDP数据包,告诉发送端已准备好接收数据,并请求一个TCP的连接
3.发送端接收连接的请求,并将文件映射到内存中,然后创建发送文件线程,开始进行数据的发送
4.接收端创建接收的文件,然后创建接收数据的线程,开始收取数据.接受完以后,将数据写入到创建好的文件中.
8.协议可以让运行于两个不同平台的程序之间做到“心有灵犀一点通”,也有点像黑帮内部的切口:A说了天王盖地虎,B就要说宝塔镇荷妖。
9.飞鸽的协议也属于应用层协议,它描述了飞鸽程序通信时的语法和语义。
其语法定义如下(所有的命令字,都必需符合这样的格式要求):
Ver(
1): PacketNo:SenderName:SenderHost:CommandNo:AdditionalSection
每部分分别对应为:版本号(现在是1):数据包编号:发送主机:命令:附加数据.
10.登录/离线通知
登录过程需要实现向局域网内的用户广播,告诉他们,“我来也!”。收到这条消息的用户则立即回复,“知道了,我在这里”,同时将新
登录的用户加入到用户列表中。发送方也可根据收到的回复信息,了解到当前网络中,都有哪些已经登录了的用户。
具体的数据包如下:
登录方(要发送到广播地址,如255.
255.255.255):
1:XXX:m8:<主机名称>:IPMSG_BR_ENTRY:
接收方回复(发送到发送方的IP地址):
1:XXX:<接收方主机名>:IPMSG_ANSENTRY:

相应的,用户离线时,应向广播地址发送“我去也!”,收到这条消息的用户,需要将发送方从自己的用户列表中移除,并且不需要回复。
具体的数据包如下:
即将离线用户:
1:XXX:m8:<主机名称>:IPMSG_BR_EXIT:
11.发送/接收消息
发送消息是飞鸽协议中最重要的部分,通过和一些命令选项,可以实现复杂的功能:
最基本的情况下,发送方通过 IPMSG_SEND_MSG 命令,可以将消息发送到接收方
1:12345:m8:<主机名称>:IPMSG_SEND_MSG:你好,飞鸽
使用命令时,“附加数据”开使发挥作用了它里面包含了要发送的消息。
通常情况下,由于UDP的不可靠性,还需要为 IPMSG_SEND_MSG 命令设定 IPMSG_SENDCHECKOPT选项,也就是要求接收方回复回执信息。
1:12345:m8:<主机名称>:IPMSG_SEND_MSG|IPMSG_SENDCHECKOPT:你好,飞鸽

接收方收到IPMSG_SEND_MSG时,如果遇到IPMSG_SENDCHECKOPT选项,就要立即回复如下信息:
1:XXX:<用户名>:<主机名>:IPMSG_RECVMSG:12345
IPMSG_RECVMSG命令通过附加数据段中的数据(
12345),告诉发送方,我收到了你的编号为12345的消息包。
12.发送/接收文件
文件的传输,要稍微复杂一些,它是通过 IPMSG_SEND_MSG 命令与 IPMSG_FILEATTACHOPT选项的组合,通知接收方“现在有文件要发给你了
”,同时要将一些描述文件属性的数据(如文件名、大小、创建时间、类别属性如文件夹),发送给接收方,具体格式如下:
file1ID:filename:size:mtime:fileattr[:extend
-attr=val1[,val2...][:extend-attr2=...]]:\a:file2ID...
这里需要注意的有几点,
第一,一条文件传送命令,可以携带多条文件信息;
第二,多个文件信息之前,要用\a分割;
第三,size, mtime 和fileattr 是用十六进制数描述的);第四,如果文件名中包含“:”,则需要将其转义为“::”。

相应的,接收方收到文件传送命令后,首先需要从文件属性的数据中解析出要接收的文件的属性。然后向发送方相同的端口进行TCP连接,
连接成功后,通过TCP通道向发送方发送IPMSG_GETFILEDATA命令用于接收文件或发送IPMSG_GETDIRFILES命令,用于接收文件夹。
具体接收文件的命令如下:
1:XXX:m8:<主机名>:IPMSG_GETFILEDATA:packetID:fileID : offset
这条命令通过packetID,让发送方明白对方请求的文件是源于哪个命令包;通过fileId让发送方确定要发哪个文件;通过offset;
让发送方明白要从哪个字节开始发送。
发送方的TCP通道收到上面的命令,就会发送对方请求的文件;而接收方将收到的数据保存到磁盘上即可。

原文地址:https://www.cnblogs.com/hnrainll/p/2040435.html