聊天室是网络编程的经典作业。它涉及多客户端管理和消息广播。
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 - 实战:负载均衡器
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Libevent 深度剖析与实战指南】实战:负载均衡器 (Load Balancer)
实现一个具备 Round-Robin 调度和健康检查功能的 TCP 负载均衡器。
【Libevent 深度剖析与实战指南】实战:简易 Redis (Redis-lite)
手写一个兼容 Redis 协议的 KV 存储服务器,学习 RESP 协议解析与内存数据结构管理。
【Libevent 深度剖析与实战指南】实战:SOCKS5 代理
实现一个完整的 SOCKS5 代理服务器,深入理解协议状态机与认证流程。
【Libevent 深度剖析与实战指南】实战:透明代理 (Transparent Proxy)
从零实现一个高性能 TCP 透明代理,掌握 bufferevent 的流量转发与背压 (Backpressure) 控制。