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

会议通信系统核心流程详解(底稿1)

会议通信系统核心流程详解

系统架构概览

管理
房间进程1
房间进程2
房间进程N
发送线程1
发送线程2
接收线程
主进程
进程池
线程池
线程池
线程池
客户端
客户端
客户端

一、创建会议室流程

1. 整体流程

ClientMainProcessRoomProcessCREATE_MEETING 请求查找空闲房间进程传递客户端连接(命令'C')初始化会议室返回会议室ID(PID)ClientMainProcessRoomProcess

2. 进程/线程交互

组件行为
主进程1. 接收客户端请求
2. 查找空闲房间进程
3. 通过UNIX套接字传递客户端连接
房间进程1. accept_fd线程接收新连接
2. 设置房主身份
3. 发送线程返回会议室ID
客户端等待会议室创建响应

3. 关键代码逻辑

// 主进程分配房间
void dowithuser(int connfd) {if (msgtype == CREATE_MEETING) {// 查找空闲房间for (i = 0; i < nprocesses; i++) {if (room->pptr[i].child_status == 0) break;}// 传递连接给房间进程char cmd = 'C';write_fd(room->pptr[i].child_pipefd, &cmd, 1, connfd);}
}// 房间进程接收连接
void* accept_fd(void *arg) {read_fd(pipefd, &cmd, 1, &client_fd);if (cmd == 'C') {// 添加为新房主FD_SET(client_fd, &user_pool->fdset);user_pool->owner = client_fd;// 发送会议室ID(PID)给客户端MSG msg;msg.msgType = CREATE_MEETING_RESPONSE;int roomNo = getpid();msg.ptr = (char*)&roomNo;sendqueue.push_msg(msg);}
}

二、加入会议室流程

1. 整体流程

NewClientMainProcessRoomProcessExistingClientJOIN_MEETING (roomID)传递连接(命令'J')验证会议室状态加入成功响应广播新用户加入发送现有用户列表NewClientMainProcessRoomProcessExistingClient

2. 进程/线程交互

组件行为
主进程1. 解析会议室ID
2. 找到对应房间进程
3. 传递新客户端连接
房间进程1. accept_fd线程接收连接
2. 验证会议室状态
3. 发送线程广播通知
新客户端接收加入结果和用户列表
现有客户端接收新用户加入通知

3. 关键代码逻辑

// 房间进程处理加入请求
void* accept_fd(void *arg) {if (cmd == 'J') {// 添加到用户池FD_SET(client_fd, &user_pool->fdset);user_pool->num++;// 广播新用户加入MSG join_msg;join_msg.msgType = PARTNER_JOIN;join_msg.ip = getpeerip(client_fd);sendqueue.push_msg(join_msg);// 发送现有用户列表MSG list_msg;list_msg.msgType = PARTNER_JOIN2;// 收集所有用户IP...sendqueue.push_msg(list_msg);}
}

三、消息收发与转发流程

1. 整体流程

SenderRoomProcessReceiver1Receiver2发送线程发送消息(TEXT_SEND/IMG_SEND)接收线程解析消息存入发送队列从队列取消息转发消息(TEXT_RECV/IMG_RECV)转发消息SenderRoomProcessReceiver1Receiver2发送线程

2. 进程/线程交互

组件行为
发送客户端1. 构造消息包
2. 发送到房间进程
房间进程主线程1. 接收原始消息
2. 解析消息头
3. 存入发送队列
发送线程池1. 从队列取消息
2. 转换消息类型
3. 广播给其他用户
接收客户端接收转换后的消息

3. 消息协议格式

$[2字节类型][4字节IP][4字节长度]数据#

示例:文字消息 “Hello” 的发送包:

$0x0001 192.168.1.100 0005 Hello#

4. 关键代码逻辑

// 接收消息
void process_main(...) {if (FD_ISSET(fd, &rset)) {Readn(fd, head, 11); // 读消息头if (msgtype == TEXT_SEND) {// 读取完整数据Readn(fd, data, datalen);// 存入队列(转换为TEXT_RECV)MSG msg;msg.msgType = TEXT_RECV;msg.ptr = data;sendqueue.push_msg(msg);}}
}// 发送线程
void* send_func(void *arg) {MSG msg = sendqueue.pop_msg();// 构建转发包头buf = "$" + 消息类型 + 发送者IP + 数据长度 + 数据 + "#";// 广播给除发送者外的所有用户for (int i = 0; i <= maxfd; i++) {if (user_pool->status[i] == ON && i != msg.targetfd) {writen(i, buf, len);}}
}

四、进程/线程通信关系

1. 整体通信架构

UNIX套接字
UNIX套接字
线程间队列
线程间队列
主进程
房间进程1
房间进程2
发送线程池
发送线程池

2. 通信方式详解

通信路径技术数据
主进程 ↔ 房间进程UNIX域套接字命令字(‘C’,‘J’,‘E’,‘Q’) + 文件描述符
房间进程内部线程消息队列MSG结构体(类型/数据/目标)
房间进程 ↔ 客户端TCP套接字结构化消息包

3. 消息队列实现

class SEND_QUEUE {pthread_mutex_t lock;pthread_cond_t cond;queue<MSG> send_queue;public:void push_msg(MSG msg) {lock();while (queue.full()) wait(cond);send_queue.push(msg);signal(cond);unlock();}MSG pop_msg() {lock();while (queue.empty()) wait(cond);MSG msg = send_queue.front();send_queue.pop();signal(cond);unlock();return msg;}
};

五、异常处理机制

1. 用户掉线处理

RoomProcessMainProcessOtherClients检测到连接关闭清理会议室发送'E'命令强制关闭连接发送'Q'命令广播退出通知alt[房主退出][普通用户退出]RoomProcessMainProcessOtherClients

2. 关键代码

void fdclose(int fd, int pipefd) {if (user_pool->owner == fd) {// 房主退出user_pool->clear_room();char cmd = 'E';writen(pipefd, &cmd, 1);} else {// 普通用户退出char cmd = 'Q';writen(pipefd, &cmd, 1);// 广播退出通知MSG msg;msg.msgType = PARTNER_EXIT;msg.ip = user_pool->fdToIp[fd];sendqueue.push_msg(msg);}
}

六、性能优化设计

  1. 线程池处理发送

    // 每个房间进程创建5个发送线程
    for (int i = 0; i < SENDTHREADSIZE; i++) {Pthread_create(&tid, NULL, send_func, NULL);
    }
    
  2. 零拷贝发送

    struct iovec iov[2];
    iov[0].iov_base = header;
    iov[0].iov_len = header_len;
    iov[1].iov_base = payload;
    iov[1].iov_len = payload_len;
    writev(fd, iov, 2);
    
  3. 批处理状态更新

    // 主进程批量处理状态更新
    for (int i = 0; i < nprocesses; i++) {if (FD_ISSET(room->pptr[i].child_pipefd, &rset)) {char cmd;Readn(pipefd, &cmd, 1);// 处理命令}
    }
    

总结

本系统通过多进程+多线程架构实现了高效会议通信:

  1. 进程隔离:每个会议室独立进程,故障隔离
  2. 线程协作:接收/发送线程分离,避免阻塞
  3. 高效通信:UNIX域套接字+消息队列减少拷贝
  4. 负载均衡:进程池动态分配会议室资源

这种架构平衡了性能与稳定性,是实时通信系统的经典实现方案。

http://www.lryc.cn/news/621220.html

相关文章:

  • Linux软件编程:进程和线程
  • C#面试题及详细答案120道(01-10)-- 基础语法与数据类型
  • Flink Stream API 源码走读 - socketTextStream
  • 2025H1手游市场:SLG领涨、休闲爆发,何为出海新航道?
  • 广告灯的左移右移
  • Day43 复习日
  • FPGA+护理:跨学科发展的探索(五)
  • Kotlin Data Classes 快速上手
  • 【深度学习】深度学习基础概念与初识PyTorch
  • 报数游戏(我将每文更新tips)
  • IPTV系统:开启视听与管理的全新篇章
  • 14 ABP Framework 文档管理
  • 【软考中级网络工程师】知识点之入侵防御系统:筑牢网络安全防线
  • SpringMVC(详细版从入门到精通)未完
  • P5967 [POI 2016] Korale 题解
  • 【数据分享】2014-2023年长江流域 (0.05度)5.5km分辨率的每小时日光诱导叶绿素荧光SIF数据
  • stm32项目(28)——基于stm32的环境监测并上传至onenet云平台
  • LT3045EDD#TRPBF ADI亚德诺 超低噪声LDO稳压器 电子元器件IC
  • web网站开发,在线%射击比赛成绩管理%系统开发demo,基于html,css,jquery,python,django,model,orm,mysql数据库
  • 模型选择与调优
  • 0814 TCP和DUP通信协议
  • 2021睿抗决赛 猛犸不上 Ban
  • 十分钟学会一个算法 —— 快速排序
  • ASCII与Unicode:编码世界的奥秘
  • 【前端工具】使用 Node.js 脚本实现项目打包后自动压缩
  • C#WPF实战出真汁02--登录界面设计
  • 微服务从0到1
  • 在Ubuntu上安装Google Chrome的详细教程
  • Ubuntu下载、安装、编译指定版本python
  • 大规模调用淘宝商品详情 API 的分布式请求调度实践