聊天室是网络编程的经典作业。它涉及多客户端管理和消息广播。
1. 连接管理
我们需要一个全局列表来保存所有在线用户。
struct client {
struct bufferevent *bev;
char username[32];
TAILQ_ENTRY(client) next;
};
TAILQ_HEAD(client_list, client) clients;2. 广播逻辑
当收到某个用户的消息时,遍历列表,转发给其他人。
void broadcast(const char *msg, struct client *sender) {
struct client *c;
TAILQ_FOREACH(c, &clients, next) {
if (c != sender) {
bufferevent_write(c->bev, msg, strlen(msg));
}
}
}3. 鉴权与指令
我们可以定义简单的文本协议: *
LOGIN <name>: 登录。 *
MSG <content>: 发言。
在 read_cb
中解析指令。如果用户未登录(c->username
为空),则只允许 LOGIN 指令。
4. 总结
这个项目虽然简单,但它包含了即时通讯软件(IM)的核心雏形:连接维持、状态同步、消息分发。
完整代码: 03-chat-server.c
上一篇: 08-projects/redis-lite.md - 实战:简易 Redis 下一篇: 08-projects/load-balancer.md - 实战:负载均衡器
源码下载
本文相关源码已整理,共 1 个文件。
文章导航
分类入口
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【Libevent 深度剖析与实战指南】实战:负载均衡器 (Load Balancer)
实现一个具备 Round-Robin 调度和健康检查功能的 TCP 负载均衡器。
【Libevent 深度剖析与实战指南】测试与 QA
如何为 Libevent 应用编写单元测试?探讨 Mock Loop、集成测试以及使用 libFuzzer 进行协议模糊测试。
【Libevent 深度剖析与实战指南】实战:简易 Redis (Redis-lite)
手写一个兼容 Redis 协议的 KV 存储服务器,学习 RESP 协议解析与内存数据结构管理。
【Libevent 深度剖析与实战指南】实战:SOCKS5 代理
实现一个完整的 SOCKS5 代理服务器,深入理解协议状态机与认证流程。