UDP局域网聊天室实现.pdf
《UDP局域网聊天室实现.pdf》由会员分享,可在线阅读,更多相关《UDP局域网聊天室实现.pdf(11页珍藏版)》请在咨信网上搜索。
1、UDP局域网聊天室实现1.UDP聊天室基本功能分析2.UDP实现流程分析(客户端,服务器)3.UDP聊天功能实现(群聊,私聊)4.总结1.UDP基本功能分析 在学完网络中UDP的编程之后,我们想通过实现一个UDP的聊天室来实际运用一下!那么聊天室需要哪些功能呢!我们可以类比 QQ的聊天的功能,QQ最基本的功能:1.登录注册2.聊天3.退出 那么我们也大致实现这些功能。我们做一些简化,不需要登录注册的功能,登录时,给所有连接上来的客户端发送消息,告诉说谁登录上来了客户端给服务器发送消息时就指定需要聊天的对象。我们分析一下我们聊天的过程:(1).我们实心的效果是 如:A-B(A与B进行聊天)A与B
2、聊天 实际上是 A-“消息”-服务器转发-消息-B(2).服务器发送消息 服务器-A -B -C 这是一个群发的消息2.UDP实现流程分析(客户端,服务器)分析客户端的流程:客户端:整体的流程首先是 网络的基本编程s o c k e tp i d =f o r k();i f (p i d 0)/父进程,主要功能,数据发送 w h i l e (1)/大循环 1.发送一个登录的消息,告诉大家我上线了 2.从键盘获得数据 a.聊天的对端的名字 S Y S T E R M 群聊消息 非S Y S T E R M 私聊消息 c.聊天的内容 d.输入q u i t 时,结束 3.聊天结束,发送一个聊天
3、结束的消息给大家,告诉大家说我下线了 e l s e i f (p i d =0)/子进程,主要功能,数据接收 w h i l e (1)1.接收数据 2.显示数据 分析服务器端的流程:整体的流程是 UDP的网络服务器的 基本编程s o c k e tb i n dp i d =f o r k();i f (p i d 0)/父进程 发数据,系统级别的消息,给所有客户端发送消息 1.从键盘获得数据 2.发送给服务器自己 e l s e i f (p i d =0)/子进程,接收数据,处理消息 1.接收发过来的消息 2.根据消息类型进行处理 a.登录消息 b.退出消息 d.群聊消息 这三类消息都
4、需要给每个客户端发送 e.私聊消息 需要进行指定聊天对象 分析数据结构体:首先我们要考虑一个服务器端的程序如何给每个客户端依次发送消息?1.UDP中如果向某个客户端发送消息,那么我们需要指定对端的地址信息(ip+port)的信息 那么服务器端如何保留这些客户端的信息就是我们需要关注的问题?想想看如何可以实现?。balabala那么我们这里就用的非常广泛的一种数据结构,链表来实现对 客户端地址信息的保留。链表的特点,就不需要说了。我们这里主要关注其 可以动态增长的特点来使用那么这一问题解决之后,我们要做的就是实现相关的数据结构的操作。那么我们分析一下该链表的数据结构构建。数据结构 地址信息节点:
5、t y p e d e f s t r u c t n o d e s t r u c t s o c k a d d r _ i n a d d r;s t r u c t n o d e *n e x t;d a t a _ t;/消息类型#d e f i n e C L I E N T _ T A L K 1 0 0 /私聊+c l i e n t n a m e#d e f i n e S E R V E R _ T A L K 2 0 0 /给所有客户端发送#d e f i n e C L I E N T _ L O G I N 3 0 0 /有客户端登陆,地址存入链表#d e f
6、i n e C L I E N T _ L O G O U T 4 0 0 /有客户端退出,地址从链表删除/消息结构体t y p e d e f s t r u c t l o n g t y p e;/消息类型 c h a r s r c _ n a m e 2 0 ;/自己客户端名字,在运行客户端命令行指定名字 c h a r d s t _ n a m e 2 0 ;/对方客户端名字,在运行客户端命令行指定名字 /客户端登陆时给服务器发自己的名字和地址,/*/私聊时客户端用于指定对方名字,在服务器端可以根据名字找到对应对方的地址 /服务器端转发私聊消息时如果要知道是谁发送,根据地址在链表
7、中查找名字/*/c h a r m t e x t B U F _ S Z ;/消息正文 m s g _ t;分析函数实现:服务器端:1.i n t s e n d _ a s s i g n _ c l i e n t(i n t s e r f d,L i n k l i s t *h e a d,m s g _ t *p m s g);功能:通过名字查找对应的客户端是否存在,存在则发送消息 不存在返回出错信息表示客户端不存在 给指定的客户端发送消息 参数:s e r f d 进行通信的s o c k e t 对应的文件描述符 h e a d 链表的头指针 p m s g 指定的客户端的名
8、字返回值:0 成功 -1 表示没有找到对应的客户端 2.b r o a d c a s t _ a l l _ c l i e n t(i n t s e r f d,L i n k l i s t *h e a d,m s g _ t *p m s g);功能:实现对每个客户端发送消息参数:同上返回值:0 成功3.s t r u c t s o c k a d d r _ i n *f i n d _ a s s i g n _ c l i e n t(L i n k l i s t *h e a d,c h a r *n a m e);功能:从链表中查找对应名字的客户端,找到之后返回其地址
9、信息 3.UDP聊天功能实现(群聊,私聊)/1.头文件#i f n d e f _ H E A D _ H _#d e f i n e _ H E A D _ H _#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d e /*S e e N O T E S */#i n c l u d e#i n c l u d e#i n c l u d e#i n c l u d e
10、 /#d e f i n e _ D E B _ 1#d e f i n e B U F _ S Z 1 0 2 4#d e f i n e C L I E N T _ T A L K 1 0 0#d e f i n e S E R V E R _ T A L K 2 0 0#d e f i n e C L I E N T _ L O G I N 3 0 0#d e f i n e C L I E N T _ L O G O U T 4 0 0#d e f i n e h a n d l e _ e r r o r(m s g)d o p e r r o r(m s g);e x i t(E
11、X I T _ F A I L U R E);w h i l e(0)t y p e d e f s t r u c t s o c k a d d r s a _ t;t y p e d e f s t r u c t l o n g t y p e;/消息类型 /c h a r n a m e 2 0 ;/客户端名字/L O N G I N 时给服务器发自己的名字,私聊时指定对方名字 c h a r s r c _ n a m e 2 0 ;c h a r d s t _ n a m e 2 0 ;c h a r m t e x t B U F _ S Z ;/消息正文 m s g _ t
12、;/链表的结点数据/t y p e d e f s t r u c t s o c k a d d r _ i n d a t a _ t;/t y p e d e f i n t d a t a _ t;t y p e d e f s t r u c t s t r u c t s o c k a d d r _ i n a d d r;/客户端地址 c h a r n a m e 2 0 ;/客户端名字 d a t a _ t;/链表的结点类型t y p e d e f s t r u c t _ n o d e _ d a t a _ t d a t a;s t r u c t _ n
13、o d e _ *n e x t;l i n k n o d e _ t,*l i n k l i s t _ t;/创建链表的操作e x t e r n l i n k l i s t _ t c r e a t e _ e m p t y _ l i n k l i s t();/插入链表e x t e r n i n t i n s e r t _ h e a d _ l i n k l i s t(l i n k l i s t _ t h e a d,d a t a _ t d a t a);/删除链表e x t e r n i n t d e l e t e _ a s s i g
14、 n _ n o d e(l i n k l i s t _ t h e a d,d a t a _ t d a t a);#e n d i f/2.链表操作的函数实现#i n c l u d e h e a d.h l i n k l i s t _ t c r e a t e _ e m p t y _ l i n k l i s t()l i n k n o d e _ t *h e a d =N U L L;h e a d =(l i n k n o d e _ t *)m a l l o c(s i z e o f(l i n k n o d e _ t);h e a d-n e x
15、 t =N U L L;r e t u r n h e a d;i n t i n s e r t _ h e a d _ l i n k l i s t(l i n k l i s t _ t h e a d,d a t a _ t d a t a)l i n k n o d e _ t *t e m p =N U L L;t e m p =(l i n k n o d e _ t *)m a l l o c(s i z e o f(l i n k n o d e _ t);t e m p-d a t a =d a t a;t e m p-n e x t =h e a d-n e x t;h
16、 e a d-n e x t =t e m p;r e t u r n 0;i n t d e l e t e _ a s s i g n _ n o d e(l i n k l i s t _ t h e a d,d a t a _ t d a t a)l i n k n o d e _ t *p =h e a d;l i n k n o d e _ t *t e m p =N U L L;/*w h i l e(p-n e x t&p-n e x t-d a t a !=d a t a)*/w h i l e(p-n e x t&(m e m c m p(&p-n e x t-d a t
17、a,&d a t a,s i z e o f(d a t a)!=0)p =p-n e x t;i f(p-n e x t =N U L L)r e t u r n -1;t e m p =p-n e x t;p-n e x t =t e m p-n e x t;f r e e(t e m p);t e m p =N U L L;r e t u r n 0;#i f 0i n t p r i n t _ l i n k l i s t(l i n k l i s t _ t h e a d)l i n k n o d e _ t *p =h e a d-n e x t;w h i l e(p)
18、p r i n t f(%-4 d ,p-d a t a);p =p-n e x t;p u t c h a r(n );r e t u r n 0;i n t m a i n(i n t a r g c,c o n s t c h a r *a r g v )l i n k l i s t _ t h e a d =N U L L;i n t i =0;h e a d =c r e a t e _ e m p t y _ l i n k l i s t();f o r(i =0;i n e x t;w h i l e(p)i f(s t r n c m p(p m s g-s r c _ n
19、 a m e,p-d a t a.n a m e,2 0)!=0)/不给自己回发消息 s e n d t o(s o c k f d,p m s g,s i z e o f(m s g _ t),0,(s a _ t *)&p-d a t a.a d d r,s i z e o f(s a _ t);/*p r i n t f(m s g.m t e x t =%s n ,m s g.m t e x t);*/#i f d e f _ D E B _ p u t s(=b r o a d c a s t=);p r i n t f(I p:t%s n ,i n e t _ n t o a(p-
20、d a t a.s i n _ a d d r);p r i n t f(P o r t:t%d n ,n t o h s(p-d a t a.s i n _ p o r t);p r i n t f(I n f o:t%s n ,p m s g-m t e x t);p u t s(=);#e n d i f p =p-n e x t;r e t u r n 0;s t r u c t s o c k a d d r _ i n *f i n d _ c l i e n t _ a d d r(l i n k l i s t _ t a d d r l i s t,c h a r *p n
21、a m e)l i n k n o d e _ t *p =a d d r l i s t-n e x t;w h i l e(p)i f(s t r c m p(p-d a t a.n a m e,p n a m e)=0)b r e a k;p =p-n e x t;i f(p =N U L L)r e t u r n N U L L;r e t u r n&p-d a t a.a d d r;i n t s e n d _ a s s i g n _ c l i e n t(i n t s o c k f d,l i n k l i s t _ t a d d r l i s t,m s
22、 g _ t *p m s g,s t r u c t s o c k a d d r _ i n *m y a d d r)s t r u c t s o c k a d d r _ i n *p a d d r =N U L L;p a d d r =f i n d _ c l i e n t _ a d d r(a d d r l i s t,p m s g-d s t _ n a m e);i f(p a d d r =N U L L)/未找到指定客户端,回送失败信息 p m s g-t y p e =C L I E N T _ T A L K;s p r i n t f(p m s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UDP 局域网 聊天室 实现
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。