聊天室是网络编程的经典作业。它涉及多客户端管理和消息广播。
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 - 实战:负载均衡器