IPMsg飞鸽传书网络协议解析手记
相信很多人都使用過飛鴿傳書,這個小工具在局域網傳輸數據高效而便捷,自己在大二的時候就想看看飛鴿傳書的源碼,但那時候自己的水平有限,這幾天有機會重寫飛鴿傳書,也對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最為重要的內容。
| /*????@(#)Copyright (C) H.Shirouzu 1996-1998 ipmsg.h????Ver1.34 */ |
? 報文中的命令字是一個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 |
每次IPMSG在收到上線通告報文后,都要查找相同ip的節點是否已經存在,只要和結構體成員host_ip比較就可以了,這樣整個用戶列表當中的成員是不會重復的。報文的發送主要依靠下邊的函數實現,這里推薦下邊的這種寫法,特別是對與命令比較多的情況下,使用下邊的好處就在與結構非常的清晰。
?
?
| mode: 命令? msg: 附加信息 struct sockaddr *p:網絡信息? fd:網絡套接字描述符? int msg_send(const int mode,const char *msg,const struct sockaddr *p,int fd) //下邊的if 與else if :對于上線通告 下線等使用廣播地址,其他的則否 //打開廣播 //? 關掉廣播 |
通過上邊的報文就可以實現消息的傳遞,可以發起文件、文件夾的傳輸,傳輸文件時,首先需要通過UDP報文聯絡,在UDP報文聯絡好之后,隨即發起TCP文件傳輸,文件傳輸是不帶格式的。IPMSG的一個難點就是文件夾的傳輸。今天就寫這里,而且也做到這里。
總結
以上是生活随笔為你收集整理的IPMsg飞鸽传书网络协议解析手记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《曼巴精神:科比自传》读后感
- 下一篇: 计算机flash教案,认识Flash软件