飞鸽传书原理以及相关代码详解
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
飞鸽传书的实现原理: (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 编辑过 |
关键字查询
相关文章
正在查询... |