飞鸽传书原理以及相关代码详解

来源:互联网 发布:如何在淘宝买三唑仑 编辑:程序博客网 时间:2024/05/16 09:52

最近公司事情不是很多,就想起回顾一件做得小项目,跟大家一起学习共享一下。

 

模拟飞鸽传书来实现相关的功能。首先看下:

飞鸽传书的实现原理: 

(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 收到用户发来消息,读取消息内容收取文件或者发文件。   

 

 

 

 

 

1 0
原创粉丝点击