udp服务器聊天版本

在服务器端将客户端管理起来,这样在收到数据时,决策是否增加/删除/查找/修改用户等

登录用什么标识用户的唯一性呢?如果需要登录注册,涉及到协议,暂且使用IP+端口号来唯一标识用户

对用户进行管理,一般先定义用户,但是比较复杂,要订协议,用户进行注册设置用户名和密码,登录的时候要确认,今 天从简,把InetAddr看作用户

新用户来的时候,如何处理?要通过查找看到用户列表是否有该用户,涉及到查,如果没有,进行插入,重新启动ip和端口号可能发生变化,涉及到改,也可能下线,删除

那如何管理呢?如果使用unordered_map,使用ip+port作为键,值是InetAddr,在插入的时候,使用InetAddr提供的方法toString获取键来进行比较

插入

但是也可以重载InetAddr的==符号,直接进行比较,使用vector进行管理即可

对用户进行管理,UserManager.hpp

上面UdpServer.hpp进行网络收发数据,InetAddr.hpp对用户进行描述,UserManager.hpp对用户进行组织,现在用户和网络数据还是分离的,需要将二者联系起来,使用Route.hpp对网络来的用户进行插入和删除离开网络的用户,进行广播数据等,因为用户列表是临界资源,可能并行进行增删查改,所以进行保护,其实Route这个类还是对于用户列表的再一次封装,使得UserManager对于用户列表的增删查改更为纯粹,加锁等操作都在Route完成

广播的时候,其实Route可以加一个队列成员,把需要广播的消息push到队列中,广播的时候直接从队列中取消息进行广播

并发版本

首先上面的客户端1发送aaa,但下面的客户端2还没入网,所以只会转发给客户端1消息aaa,接着客户端2发送bbb,入网,收到转发回来的bbb,接着客户端1发送ccc,并且接收之前发过来的bbb

问题:

1.只有给服务端发消息才能收消息,因为客户端是阻塞式发送,但实际上,不发消息应该也能收

2.客户端1发送ccc,没有立马收到ccc,因为接收之前的bbb,消息延迟

上面==时采用ip+port,如果只比较ip,那就是一台机器只能充当一个客户端

虽然多线程,但只有一个xshell

qt或图形化界面,每一个界面靠一个线程,不同的消息往不同的显示器上显示

把客户端改成多线程,主线程做控制,两个从线程分别负责收和发,收的输出到文件描述符2

将标准错误重定向到管道

上面分不清那句话是谁说的,而且启动客户端,不说话就没办法收消息

所以启动之后,先设置昵称,来区分消息,并且启动之后主动向服务器发送消息

简单的实现就到这里了,可以静态编译生成client_chat,发送到其它机器,通过xshell或者虚拟机运行,./client_chat 客户端的ip 客户端的port,就可以进行聊天了

qt windows启动多线程,简单聊天系统,登录注册自己加

udp 网络抖动,丢包

聊天用udp做简单,但做好不简单

没有登录注册,ip+port作为标识,

Route内定义一个全局/静态变量,64位,从1k/w开始,每注册一个就返回一个数字,类似qq号,用户入网,怎么下线,如果用户退出,在转发消息的时候,检测到quit类字眼,就从用户列表移除该用户,涉及更复杂的判断

转发的时候加锁,但是网络IO耗时,先把用户列表拷贝一份,进行IO

多线程这两个函数可能线程不安全

整体代码量有些大,因为对套接字不是很熟悉,不了解原理,感觉信息量大,把系统部分整合揉在一起,1000多行,udp和tcp套接字,创建过程就是套路,该创建,绑定,监听,链接,都是固定的,感觉陌生是因为用的少,陌生,用的多了,套接字创建流程固定,创建套接字逻辑使用设计模式模板化,正在学接口,从0到1建立的过程

相关推荐
91刘仁德8 小时前
Linux网络编程从入门到实战:UDP/TCP协议与socket编程全解析
linux·网络·笔记·tcp/ip·udp
91刘仁德10 小时前
传输层协议深度拆解:端口寻址、UDP 报文与 TCP 可靠性机制全解析
linux·网络·c++·网络协议·tcp/ip·udp·c
傲世仙尊1 天前
UDP底层与守护进程化-报头结构体skbuff指针移动与自成会话
驱动开发·网络协议·udp
自己的九又四分之三站台2 天前
TCP 与 UDP:从可靠字节流到无连接数据报,怎么选、怎么测
网络协议·tcp/ip·udp
liangshanbo12152 天前
面试题:游戏、直播为什么常用 UDP?KCP 是什么?为什么比 TCP 更适合低延迟场景?
tcp/ip·游戏·udp
阿钱真强道3 天前
27 嵌入式操作系统 | C 网关:串口 ⇄ UDP 转发(先用 UDP 当上位机替身)
c语言·单片机·网关·udp·uloop
别动我齐刘海4 天前
简历技术栈全面复习——UDP / TCP / CAN / ZMQ / Protobuf 通信工程
网络·c++·python·tcp/ip·机器学习·udp·github
星恒讯工业路由器4 天前
车载以太网中的TCP与UDP:诊断、服务通信与网络管理怎么选
网络·tcp/ip·udp
不会就选b4 天前
Linux之再次理解udp
linux·运维·udp
Fcy6486 天前
Linux下 传输层协议UDP详解(含底层源码解析)
linux·运维·udp