当前位置: 首页 > article >正文

如何在Linux用libevent写一个聊天服务器

废话少说,先看看思路
因为libevent的回调机制,我们可以借助这个机制来创建bufferevent来实现用户和用户进行通信
在这里插入图片描述
如果成功连接后我们可以直接在listener回调函数里创建一个bufferevent缓冲区,并为每个缓冲区设置相应的读回调和事件回调,读回调是专门处理用户给服务器发送的指令,服务器通过指令执行登陆账号,添加好友,删除好友,注销账号,列出好友列表,发送信息的操作
在这里插入图片描述
如果用户离线,我们就得用到事件回调,它能自动改变数据库中用户的状态,并释放相应的内存,减少服务器负载
在这里插入图片描述
那么如何储存用户数据呢,那自然是创建一个全局变量的Client类的数组的动态指针(在写代码时我一直想需不需要用链表,用链表在处理用户注销时很方便,但在初始化时可能很麻烦,所以我暂时没用链表)

一些碎碎念:Linux网络我跟着b站黑马视频学的,为了运用到实践所以自己想了这个小项目,因为黑马教的时候用的c,所以我也就用C,但写到后面会发现CPP会方便很多,尤其是用到类和对象和STL容器,在字符串处理上string容器会很方便,尤其是处理用户向好友发送信息的时候,还有我就不应该好奇去用switch,都说不好用我就想试试,果然在我后面想修改时很多会被switch限制,这些代码花了我将近十六个小时写完,有很多没完善的地方也请多谅解,后面还有很多功能例如修改密码没去实现,限制用户名和密码长度格式等,因为我暂时不想花更多时间放到这,还在研究另一个东西,所以暂时把这个项目完结了,同时我也把服务器部署到了阿里云,可能过一个多月服务器就没了(毕竟免费试用吗),ip:121.196.197.26 网络端口5888,代码仅供学习和参考

演示效果
用户登陆
请添加图片描述
添加好友asd,若没找到好友则向用户提示好友未找到
在这里插入图片描述
向好友asd发送信息hello,若用户asd未添加pyl则发送失败并提示
在这里插入图片描述
若发送成功,用户则接受消息
在这里插入图片描述

使用!del删除好友asd
在这里插入图片描述
使用!list查看好友列表及好友状态
在这里插入图片描述
!delA进行账号注销
在这里插入图片描述

源码:https://github.com/youlinpeng2005/Serv_chat

相关文章:

如何在Linux用libevent写一个聊天服务器

废话少说,先看看思路 因为libevent的回调机制,我们可以借助这个机制来创建bufferevent来实现用户和用户进行通信 如果成功连接后我们可以直接在listener回调函数里创建一个bufferevent缓冲区,并为每个缓冲区设置相应的读回调和事件回调&…...

系统设计(1)—前端—CDN—Nginx—服务集群

简介: 本指南旨涵盖前端、CDN、Nginx 负载均衡、服务集群、Redis 缓存、消息队列、数据库设计、熔断限流降级以及系统优化等模块的核心要点。我们将介绍各模块常见的设计方案与优化策略,并结合电商秒杀、SaaS CRM 系统、支付系统等高并发场景讨论实践技巧…...

算法设计与分析7(贪心算法)

Prim 算法(寻找最小生成树) 用途:Prim 算法是一种贪心算法,用于在加权无向图中寻找最小生成树(MST),即能够连接图中所有顶点且边的权重之和最小的子图。基本思路: 从图中任意一个顶…...

马浩棋:产通链CT-Chain 破局不动产 RWA,引领数智金融新变革

全球不动产 RWA 数智金融高峰论坛上马浩棋先生致辞 在全球不动产 RWA 数智金融高峰论坛暨产通链 CT-Chain 上链首发会的现场,犀牛世纪集团(香港)有限公司董事会主席马浩棋成为众人瞩目的焦点。此次盛会汇聚了全球金融、区块链及不动产领域的…...

神经符号混合与跨模态对齐:Manus AI如何重构多语言手写识别的技术边界

在全球化数字浪潮下,手写识别技术长期面临"巴别塔困境"——人类书写系统的多样性(从中文象形文字到阿拉伯语连写体)与个体书写风格的随机性,构成了人工智能难以逾越的双重壁垒。传统OCR技术在处理多语言手写场景时,准确率往往不足70%,特别是在医疗处方、古代文…...

学习整理在centos7上安装mysql8.0版本教程

学习整理在centos7上安装mysql8.0版本教程 查看linux系统版本下载mysql数据库安装环境检查解压mysql安装包创建MySQL需要的目录及授权新增用户组新增组用户配置mysql环境变量编写MySQL配置文件初始化数据库初始化msyql服务启动mysql修改初始化密码配置Linux 系统服务工具,使My…...

Kubernetes 节点 Not Ready 时 Pod 驱逐机制深度解析(下)

#作者:邓伟 文章目录 三、深度解析:源码逻辑与调优策略四、常见问题与排查五、最新动态与技术演进总结 三、深度解析:源码逻辑与调优策略 TaintManager 核心源码逻辑 (1)参数定义(kube-controller-manage…...

SIEMENS PLC程序解读 -BLKMOV (指定长度数据批量传输)

1、程序代码 2、程序解读 这段西门子 PLC 程序&#xff08;程序段 10&#xff09;实现了基于条件的数据块移动功能&#xff0c;具体解释如下&#xff1a; 条件触点&#xff1a; %M0.1 Always<>(TRUE)&#xff08;注释为 AT<>1&#xff09;&#xff1a;当 M0.1 的值…...

初识HashMap

HashMap&#xff1a;无序&#xff0c;不重复&#xff0c;无索引 HashMap小练习&#xff1a; import java.text.ParseException; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Consumer;import static java.lang.Math.abs;public cla…...

隧道高清晰广播如何提升行车安全体验?

在隧道中行驶时&#xff0c;驾驶员常面临回声干扰、语音模糊、信息过载等问题&#xff0c;传统广播系统可能不仅未能提供有效信息&#xff0c;反而因噪音增加驾驶压力。高清晰广播通过数字降噪、动态音效优化等技术&#xff0c;显著改善驾驶员的听觉体验&#xff0c;进而提升行…...

从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用

文章目录 文章目标技术选型工程搭建1. 初始化项目2. 安装开发依赖3. 项目结构4. 配置文件tsconfig.json.eslintrc.jseslint.config.prettierrc.jsrollup.config.cjs创建 .gitignore文件 设置 Git 钩子创建示例工具函数8. 版本管理和发布9 工具函数测试方案1. 安装测试依赖2. 配…...

使用 Oracle 数据库进行基于 JSON 的应用程序开发

本文为“JSON-based Application Development with Oracle Database (and MongoDB compatibility)”翻译阅读笔记。 副标题为&#xff1a;版本 19c 和 21c&#xff0c;本地和云&#xff0c;自治JSON 数据库以及适用于 MongoDB 的 Oracle 数据库 API&#xff0c;版本为2022年2月…...

Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用

目录 一、背景与重要性‌二、CSS选择器基础与分类‌2.1 什么是选择器&#xff1f;‌2.2 选择器分类与语法‌ 三、核心选择器详解与实战案例‌3.1 基础选择器&#xff1a;精准定位元素‌3.2 组合选择器&#xff1a;元素关系控制‌3.3 伪类与伪元素&#xff1a;动态与虚拟元素‌3…...

Cadence学习笔记之---原理图设计基本操作

目录 01 | 引 言 02 | 环境描述 03 | 原理图工具介绍 04 | 原理图设计基本操作 05 | 生成页间引用 06 | 元件自动编号 07 | 结 尾 01 | 引 言 书接上回&#xff0c;在前文中讲述了怎样制作常用的库元件&#xff0c;如电阻、二极管&#xff0c;IC器件&#xff0c;以及怎…...

从零开始学习人工智能Day5-Python3 模块

​​​二、Python3基础语法学习 三、Python3 基本数据类型 四、Python3 数据类型转换 五、Python3 运算符 六、python基本数据类型(续) 七、Python3 控制语句 八、Python推导式 九、Python3 函数 十、Python3 数据结构 十一、Python3 模块 Python 中的模块&#xff08…...

进行性核上性麻痹饮食指南:科学膳食助力对抗疾病

进行性核上性麻痹是一种进展性神经退行性疾病&#xff0c;常导致患者出现吞咽困难、运动障碍等症状。科学合理的饮食不仅能为患者提供必要的营养支持&#xff0c;还能降低并发症风险&#xff0c;改善生活质量。 蛋白质是维持身体机能的关键&#xff0c;患者应注重优质蛋白的摄取…...

vue滑块组件设计与实现

vue滑块组件设计与实现 设计一个滑块组件的思想主要包括以下几个方面&#xff1a;用户交互、状态管理、样式设计和事件处理。以下是详细的设计思想&#xff1a; 1. 用户交互 滑块组件的核心是用户能够通过拖动滑块来选择一个值。因此&#xff0c;设计时需要考虑以下几点&…...

opencv函数展示4

一、形态学操作函数 1.基本形态学操作 &#xff08;1&#xff09;cv2.getStructuringElement() &#xff08;2&#xff09;cv2.erode() &#xff08;3&#xff09;cv2.dilate() 2.高级形态学操作 &#xff08;1&#xff09;cv2.morphologyEx() 二、直方图处理函数 1.直方图…...

附赠二张图,阐述我对大模型的生态发展、技术架构认识。

文章精炼&#xff0c;用两张图说明大模型发展业态方向&#xff0c;以及大模型主体技术架构。&#xff08;目前还需要进一步验证我的Thought && ideas&#xff0c;等待机会吧.........&#xff09; 图一&#xff1a;探究大模型三个层次应用方向&#xff0c;浅层次入门简…...

OpenCv高阶(九)——背景建模

目录 一、背景建模的核心目标与核心挑战 1. 核心目标 2. 核心挑战 ​二、背景建模模型 1、帧差法原理 2. 概率模型&#xff08;Parametric Models&#xff09; &#xff08;1&#xff09;高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09; &#xff08;…...

leetcode - 字符串

字符串 466. 统计重复个数 题目 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如&#xff0c;str ["abc", 3] "abcabcabc" 。 如果可以从 s2( )中删除某些字符使其变为 s1&#xff0c;则称字符串 s1( )可以从字符串 s2 获得。 例如&#xf…...

【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理

1.关于文件的预备知识 1.1 文件的宏观理解 广义上理解&#xff0c;键盘、显示器等都是文件&#xff0c;因为我们说过“Linux下&#xff0c;一切皆文件”&#xff0c;当然我们现在对于这句话的理解是片面的&#xff1b;狭义上理解&#xff0c;文件在磁盘上&#xff0c;磁盘是一…...

Freertos--统计所有任务栈信息以及CPU占比和钩子函数

一、概念 在 FreeRTOS 中统计任务栈信息和 CPU 占比是为了分析栈使用情况防止溢出、优化性能识别高负载任务、合理分配资源避免内存浪费、调试系统排查阻塞或优先级问题&#xff0c;有助于提升效率、确保稳定性、快速定位问题并防止崩溃&#xff0c;比如在你的蜂鸣器任务中可以…...

京东商品详情API接口调用技术指南‌

本文基于京东宙斯开放平台&#xff08;JD Open API&#xff09;的 jingdong.ware.product.detail.search.get 接口&#xff0c;提供商品详情数据获取的完整技术方案&#xff0c;包含参数说明、代码实现及实战避坑指南。 一、接口功能与权限‌ 核心能力‌ 获取商品SKU的完整信…...

基于Java(JSP)+MySQL实现深度学习的音乐推荐系统

基于深度学习的音乐推荐系统简述 本文简要介绍我做的基于深度学习的音乐推荐系统。主要从需求分析与设计实现的角度来进行介绍。 需求分析 基于深度学习的音乐推荐系统旨在以个性化音乐推荐模型为基础&#xff0c;使用B/S架构的形式实现。个性化推荐模型使用了 随机梯度下降…...

Linux:进程间通信---匿名管道

文章目录 1. 进程间通信1.1 什么是进程间通信&#xff1f;1.2 为什么进程要进行进程间通信&#xff1f;1.3 怎么实现进程间通信&#xff1f; 2. 匿名管道2.1 匿名管道的原理2.2 匿名管道的系统接口2.3 匿名管道的使用2.4 匿名管道的运用场景 序&#xff1a;在上一篇文章中我们知…...

C++ 类及函数原型详解

一、引言 在C 编程中&#xff0c;类&#xff08;Class&#xff09;是面向对象编程的核心概念之一&#xff0c;它是一种用户自定义的数据类型&#xff0c;封装了数据和操作数据的函数&#xff08;成员函数&#xff09;。函数原型则为函数的声明提供了必要的信息&#xff0c;让编…...

深度学习小记(包括pytorch 还有一些神经网络架构)

这个是用来增加深度学习的知识面或者就是记录一些常用的命令,会不断的更新 import torchvision.transforms as transforms toPIL transforms.ToPILImage()#可以把tensor转换为Image类型的 imgtoPIL(img) #利用save就可以保存下来 img.save("/opt/data/private/stable_si…...

声音分离人声和配乐base,vocals,drums -从头设计数字生命第6课, demucs——仙盟创梦IDE

demucs -n htdemucs --two-stemsvocals 未来之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未来之窗.mp3 伴奏提取人声分离技术具有多方面的重大意义&#xff0c;主要体现在以下几个领域&#xff1a; 音乐创作与制作 创作便利…...

深度探索多模态数据:从声音到图像的奇妙世界

深度探索多模态数据&#xff1a;从声音到图像的奇妙世界 在多模态深度学习的旅程中&#xff0c;我们不仅要了解不同数据形式的融合策略&#xff0c;还需要熟悉各种数据类型的特性。今天&#xff0c;我们将探索两种常见但极具价值的模态&#xff1a;音频数据和医学CT扫描。 音…...