服务器多客户端连接核心要点(1)

[复制链接]
发表于 2025-5-12 01:11:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
刷题

服务器多客户端连接核心要点


多进程服务器

实现原理



  • fork子进程:每次accept新客户端后,调用fork创建子进程。
  • 独立处理:子进程负责与客户端通信(如read/write),父进程继续监听新连接。
特点



  • 隔离性高:进程间资源独立,制止数据竞争。
  • 资源消耗大:频仍创建进程导致内存和CPU开销高。

多线程服务器

实现原理



  • 创建新线程:accept后生成线程处理客户端哀求。
  • 线程函数:在线程内执行read/write利用。
特点



  • 轻量级:线程共享进程资源,开销低于进程。
  • 需同步机制:需使用互斥锁(mutex)或信号量制止数据竞争。

多路I/O模子

核心题目



  • 壅闭冲突:传统accept和read相互壅闭,无法同时处理多客户端。
  • 解决方案:通过非壅闭模子(select/poll)同一监听所有描述符。

Select模子

流程


  • 初始化监视列表:
  1. fd_set read_fds;
  2. FD_ZERO(&read_fds);          // 清空列表
  3. FD_SET(server_fd, &read_fds); // 添加服务端套接字
复制代码

  • 循环监听:
    1. select(max_fd + 1, &read_fds, NULL, NULL, NULL); // 阻塞直至描述符激活
    复制代码
  • 处理激活描述符:

    • 遍历描述符,通过FD_ISSET判断是否激活。
    • 服务端套接字激活:调用accept接受新客户端。
    • 客户端套接字激活:调用read读取数据。

缺点



  • 服从低:每次调用需遍历所有描述符。
  • 监视列表上限:默认限制1024个描述符。

Poll模子

流程


  • 初始化监视列表:
  1. struct pollfd fds[MAX_CLIENTS];
  2. fds[0].fd = server_fd;
  3. fds[0].events = POLLIN; // 监视可读事件
复制代码

  • 循环监听:
    1. poll(fds, nfds, -1); // 永久阻塞直至事件触发
    复制代码
  • 处理激活描述符:

    • 遍历fds数组,检查revents是否为POLLIN。
    • 服务端激活:accept新客户端并加入列表。
    • 客户端激活:read数据并相应。

优点



  • 无描述符数目限制:支持动态扩展。
  • 事件类型机动:可同时监视读写和非常事件。

模子对比

特性SelectPoll描述符上限1024(系统默认)无限制服从O(n)遍历O(n)遍历事件类型仅可读/可写/非常支持自定义事件(如POLLIN)跨平台支持广泛支持Linux专用
实际应用场景

  
总结:多进程/线程得当简单场景,多路I/O模子(select/poll)通过非壅闭监听提升服从,需根据并发需求选择模子。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表