欢迎来到天天文库
浏览记录
ID:51335999
大小:637.25 KB
页数:11页
时间:2020-03-10
《UDP局域网聊天室实现.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、UDP局域网聊天室实现1.UDP聊天室基本功能分析2.UDP实现流程分析(客户端,服务器)3.UDP聊天功能实现(群聊,私聊)4.总结1.UDP基本功能分析在学完网络中UDP的编程之后,我们想通过实现一个UDP的聊天室来实际运用一下~!那么聊天室需要哪些功能呢!我们可以类比QQ的聊天的功能,QQ最基本的功能:1.登录注册2.聊天3.退出那么我们也大致实现这些功能。我们做一些简化,不需要登录注册的功能,登录时,给所有连接上来的客户端发送消息,告诉说谁登录上来了客户端给服务器发送消息时就指定需要聊天
2、的对象。我们分析一下我们聊天的过程:(1).我们实心的效果是如:A---->B(A与B进行聊天)A与B聊天实际上是A---“消息”--服务器转发---"消息"---->B(2).服务器发送消息服务器-->A-->B--->C这是一个群发的消息2.UDP实现流程分析(客户端,服务器)分析客户端的流程:客户端:整体的流程首先是网络的基本编程socketpid=fork();if(pid>0)//父进程,主要功能,数据发送{while(1){//大循环1.发送一个登录的消息,告诉大家我上线了2..从键
3、盘获得数据a.聊天的对端的名字SYSTERM群聊消息非SYSTERM私聊消息c.聊天的内容d.输入quit时,结束3.聊天结束,发送一个聊天结束的消息给大家,告诉大家说我下线了}}}elseif(pid==0)//子进程,主要功能,数据接收{while(1){1.接收数据2.显示数据}}分析"服务器端"的流程:整体的流程是UDP的网络服务器的基本编程socketbindpid=fork();if(pid>0)//父进程发数据,系统级别的消息,给所有客户端发送消息{1.从键盘获得数据2.发送给服务
4、器自己}elseif(pid==0)//子进程,接收数据,处理消息{1.接收发过来的消息2.根据消息类型进行处理a.登录消息b.退出消息d.群聊消息这三类消息都需要给每个客户端发送e.私聊消息需要进行指定聊天对象}分析数据结构体:首先我们要考虑一个服务器端的程序如何给每个客户端依次发送消息?1.UDP中如果向某个客户端发送消息,那么我们需要指定对端的地址信息(ip+port)的信息那么服务器端如何保留这些客户端的信息就是我们需要关注的问题?想想看如何可以实现?。。。。。。balabala那么我们
5、这里就用的非常广泛的一种数据结构,链表来实现对客户端地址信息的保留。链表的特点,就不需要说了。我们这里主要关注其可以动态增长的特点来使用那么这一问题解决之后,我们要做的就是实现相关的数据结构的操作。那么我们分析一下该链表的数据结构构建。数据结构地址信息节点:typedefstructnode{structsockaddr_inaddr;structnodenext;}data_t;//消息类型#defineCLIENT_TALK100//私聊+clientname#defineSERVER_TA
6、LK200//给所有客户端发送#defineCLIENT_LOGIN300//有客户端登陆,地址存入链表#defineCLIENT_LOGOUT400//有客户端退出,地址从链表删除//消息结构体typedefstruct{longtype;//消息类型charsrc_name[20];//自己客户端名字,在运行客户端命令行指定名字chardst_name[20];//对方客户端名字,在运行客户端命令行指定名字//客户端登陆时给服务器发自己的名字和地址,/{{{///私聊时客户端用于指定对方名字
7、,在服务器端可以根据名字找到对应对方的地址//服务器端转发私聊消息时如果要知道是谁发送,根据地址在链表中查找名字/}}}/charmtext[BUF_SZ];//消息正文}msg_t;分析函数实现:服务器端:1.intsend_assign_client(intserfd,Linklisthead,msg_tpmsg);功能:通过名字查找对应的客户端是否存在,存在则发送消息不存在返回出错信息表示客户端不存在给指定的客户端发送消息参数:@serfd进行通信的socket对应的文件描述符@head链
8、表的头指针@pmsg指定的客户端的名字返回值:0成功-1表示没有找到对应的客户端2.broadcast_all_client(intserfd,Linklisthead,msg_tpmsg);功能:实现对每个客户端发送消息参数:同上返回值:0成功3.structsockaddr_infind_assign_client(Linklisthead,charname);功能:从链表中查找对应名字的客户端,找到之后返回其地址信息3.UDP聊天功能实现(群聊,私聊)//1.头文件#ifndef_HEAD
此文档下载收益归作者所有