飛鴿傳書原理以及相關代碼詳解
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
飛鴿傳書的實現原理: (1)最關鍵的是局域網用戶列表的建立;飛鴿啟動時使用UDP協議向 255.255.255.255這個廣播地址發送廣播包,默認端口是2425。廣播包內容包含用戶名、工作組、主機名、IP等信息; 已啟動飛鴿的用戶通過2425端口收到此廣播包后,就會在自己的用戶列表中添加這個用戶的用戶名、工作組等信息,同時向對方IP發送本機用戶的個人信息;從而雙方都能建立起用戶列表; (2)刷新用戶列表時發送的廣播包和啟動時差不多,只不過返回的標識信息略有不同;可以做一個小工具,監控2425端口內存流,就能截獲刷新和聊天時的消息。 (3)傳送聊天信息時同樣使用UDP協議;由于UDP協議是無連接協議,傳輸速度快,但是沒有確認機制,是不可靠的協議,需要自己定義返回信息的標志來判斷對方是否收到信息; (4)用戶離線時發送一個離線廣播包到255.255.255.255,收到此廣播包的用戶,根據包中的IP地址(也可能是多種判斷標志或者包含硬件標識,比如網卡地址等)刪除對方的用戶列表信息; (5)廣域網無法直接使用廣播方式,靠手工添加"局域網外廣播列表"來建立相互的關系; (6)飛鴿傳送文件是使用TCP協議,端口2425;
(1) 步驟一主要代碼解析如下: voidlogin(int sockfd,char *user, char *host) { char buf[200]=""; struct sockaddr_in addr={AF_INET}; addr.sin_addr.s_addr=inet_addr("192.168.1.255");//自己的主機ip地址 addr.sin_port = htons(2425); sprintf(buf,"1:%d:%s:%s:%d:%s",time(NULL),user,host,IPMSG_BR_ENTRY,user); sendto(sockfd, buf, strlen(buf),0,(structsockaddr*)&addr, sizeof(addr)); } 啟動飛鴿傳書的時候要廣播發送udp消息。
(2) 步驟二 if((tcp_fd = socket(AF_INET, SOCK_STREAM,0))<0) { perror("create udp"); exit(1); } if(bind(tcp_fd, (struct sockaddr*)&addr,sizeof(addr))!=0) { perror("bind tcp"); exit(1); } listen(tcp_fd, 10); 啟動tcp監聽其他用戶發來的消息 #defineIPMSG_BR_ENTRY 0x00000001UL #defineIPMSG_BR_EXIT 0x00000002UL #defineIPMSG_ANSENTRY 0x00000003UL #define IPMSG_BR_ABSENCE 0x00000004UL
udp消息類型標志位,根據收到消息的類型做出不同的操作。 1:IPMSG_BR_ENTRY 新用戶登錄標志,回饋本機信息 add_usr(temp[2],temp[3],inet_ntoa(addr.sin_addr)); sprintf(buf,"1:%d:%s:%s:%d:%s",time(NULL),user(),host(),IPMSG_ANSENTRY,user()); sendto(udp_fd,buf, strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr)); 2:IPMSG_BR_EXIT 用戶下線通知,在本機中刪除用戶 del_usr(inet_ntoa(addr.sin_addr)); 3:IPMSG_ANSENTRY 用戶回應登錄信息,添加用戶就好 add_usr(temp[2],temp[3],inet_ntoa(addr.sin_addr)); 4:IPMSG_BR_ABSENCE 收到用戶發來消息,讀取消息內容收取文件或者發文件。 該文章在 2016/12/23 18:31:37 編輯過 |
關鍵字查詢
相關文章
正在查詢... |