I/O多路复用,零拷贝,高并发聊天室demo

网络编程面试八股:TCP/IP、Socket与Epoll核心知识点全解析 网络编程是后端开发与Linux服务端岗位面试中的核心能力,其底层逻辑涉及TCP/IP协议栈、Socket通信模型与I/O多路复用机制。理解TCP三次握手与四次挥手的状态流转,掌握滑动窗口、流量控制与拥塞控制的设计思想,是构建可靠网络服务的基石。同时,Socket编程从阻塞到非阻塞、从多线程到事件驱动的演进,以及select、poll、epoll在高并发场景下的取舍,直接体现工程师的工程实践水平。面对粘包拆包、TIME_WAIT堆积、半连接队列溢出等高频问题,不仅需要懂原理,更要具备借助抓包工具与自动化压测定 阅读详情

1.客户端:

客户端程序使用poll同事监听用户输入和网络连接,并利用splice函数将用户输入内容直接定向到网络连接上以发送之,从而实现数据零拷贝,提高了程序执行效率。

splice函数简介:

#include <fcntl.h>  
ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);

splice用于在两个文件描述符之间移动数据, 也是零拷贝。

①fd_in参数是待输入描述符。如果它是一个管道文件描述符,则②off_in必须设置为NULL;否则off_in表示从输入数据流的何处开始读取,此时若为NULL,则从输入数据流的当前偏移位置读入。
③/④fd_out/off_out与上述相同,不过是用于输出。
⑤len参数指定移动数据的长度。
⑥flags参数则控制数据如何移动:

  • SPLICE_F_NONBLOCK:splice 操作不会被阻塞。然而,如果文件描述符没有被设置为不可被阻塞方式的 I/O ,那么调用 splice 有可能仍然被阻塞。
  • SPLICE_F_MORE:告知操作系统内核下一个 splice 系统调用将会有更多的数据传来。
  • SPLICE_F_MOVE:如果输出是文件,这个值则会使得操作系统内核尝试从输入管道缓冲区直接将数据读入到输出地址空间,这个数据传输过程没有任何数据拷贝操作发生。

使用splice时, fd_in和fd_out中必须至少有一个是管道文件描述符。
调用成功时返回移动的字节数量;它可能返回0,表示没有数据需要移动,这通常发生在从管道中读数据时而该管道没有被写入的时候。
失败时返回-1,并设置errno。

客户端程序如下:poll监听标准输入,直接重定向到sockfd。

/*************************************************************************
        > File Name: client.c
      > Author: dulun
      > Mail: dulun@xiyoulinux.org
      > Created Time: 2016年07月19日 星期二 11时01分09秒
 ************************************************************************/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<poll.h>
#include<fcntl.h>
#include<assert.h>
#define BUFFER_SIZE 64

int main()
{
    const char * ip = "127.0.0.1";
    int port = 10086;

    struct sockaddr_in server_address;
    bzero( &server_address, sizeof(server_address) );
    server_address.sin_family = AF_INET;
    inet_pton( AF_INET, ip, &server_address.sin_addr );
    server_address.sin_port = htons(port);

    int sockfd = socket( PF_INET, SOCK_STREAM, 0 );
    assert(sockfd >= 0);

    if( connect(sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) < 0 )
    {
        printf("connetcion failed\n");
        close(sockfd);
        return <
C++ Asio高性能网络编程实战:从架构设计到性能优化 异步I/O是现代高性能网络编程的核心技术,它通过事件驱动模型将I/O等待与业务处理解耦,从而在单线程内高效管理大量并发连接。其原理基于操作系统的I/O多路复用机制(如epoll、kqueue),允许应用在数据就绪时被通知,而非主动轮询,这大幅减少了线程上下文切换和系统调用开销。这一技术价值在于能够以极少的资源支撑海量连接,是实现高并发、低延迟服务的基石,广泛应用于游戏服务器、金融交易系统、物联网网关等场景。本文聚焦于C++ Asio库,深入探讨如何通过多线程io_context负载均衡、内存池优化、时间轮定 阅读详情

相关推荐

C++实现高性能即时通信系统:从网络编程到分布式架构

网络编程是构建分布式系统的核心技术,其核心在于理解Socket通信、IO多路复用和并发处理等基本原理。通过自定义二进制协议和高效序列化机制,可以在保证数据完整性的同时实现低延迟传输,这对于追求极致性能的即时通信、游戏服务器和金融交易系统等场景具有重要价值。在实际工程中,采用基于epoll/kqueue的Reactor模式能够有效管理海量连接,结合线程池和无锁队列等技术解决高并发下的性能瓶颈。本文以C++即时通信项目为例,深入探讨了从单机架构到负载均衡与分布式架构的演进路径,涵盖了连接管理、消息路由和心跳机制

weixin_30566111的博客 372

多路复用

1 多路复用的基本概念多路复用(multiplexing),简称复用,是通信技术中的基本概念,多路复用多用在电路交换技术中。多路复用(Multiplexing): 链路/网络资源(如带宽)划分为“资源片”,将资源片分配给各路“呼叫”(calls),每路呼叫独占分配到的资源片进行通信,资源片可能“闲置”(idle)(无共享)。典型多路复用方法: 频分多路复用( frequency division

一万HOURS的知识库 4430

钉钉Java面经及参考答案

TCP 三次握手建立连接的核心目标是双向确认双方发送、接收能力,同步通信序列号,协商初始窗口大小,防止历史过期连接报文干扰新连接。第一次握手,客户端主动向服务端发送 SYN 报文,携带客户端随机生成的初始序列号 ISN,客户端状态变更为 SYN_SENT,目的是告知服务端客户端具备发送数据的能力。第二次握手,服务端收到 SYN 报文后,回复 SYN+ACK 报文,其中 ACK 确认号为客户端 ISN+1,同时携带服务端自身随机初始序列号,服务端进入 SYN_RCVD 状态,代表服务端确认收到客户端报文,且自

大模型大数据攻城狮的专栏 238

chat:C\C++语言利用epoll实现高并发聊天室Demo

chat 项目介绍 本项目是实现一个简单的聊天室,聊天室分为服务端和客户端。采用C/S模型,使用TCP连接。 相关技术点: 支持多个用户接入,实现聊天室的基本功能 使用epoll机制实现并发,增加效率。 使用fork创建两个进程,一个为写进程,一个为读进程。 将聊天信息写到管道(pipe),并发送给父进程。 使用epoll机制接受服务端发来的信息,并显示给用户,使用户看到其他用户的聊天信息 运行效果 订阅客户端接受来自发布服务端的的内容示意图 运行环境 ubuntu 快速教程 1.下载源码 2.解压 3.进入源码目录,运行make命令,生成server,client可执行程序 4.运行server程序 5.运行client订阅者程序 项目结构 无 版权信息 暂无

一个用c++编写的聊天程序客户端.rar_c++ 聊天程序

一个用c++编写的聊天程序客户端

摄像头模组CCM简介

摄像头模组,全称Camera Compact Module,简写为CCM。CCM 包含几大件: 镜头(lens)、音圈马达(VCM)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)。工作原理:物体通过镜头(lens)聚集的光,通过CMOS或CCD集成电路,把光信号转换成电信号,再经过内部图像处理器(ISP)转换成数字图像信号输出到数字信号处理器(DSP)加工处理,转换成标准的GRB、YUV等格式图像信号。摄像头模组主要由以下几个部分组成:镜头(Lens):将光线汇聚到图像传感器上。

m0_73482095的博客 1万+

虚拟机VirtualBox下载与安装、安装Ubuntu超详细图文步骤,对一些配置问题也有所写。

自己使用过两款虚拟机,相较于VMware虚拟机来说,virtuabox虚拟机所占内存更小,只有几十兆,且完全开源不收费,里面的功能与VMware基本差不多(在日常开发、学习使用完全够用)。最主要的是,在博主自己使用VMware时经常出错,而virtualbox就更稳定一些,所以这篇是针对virtualbox的安装与一些细节部分。

l1015649309的博客 4万+

上证指数30年k线图_金融占星简单解读上证指数30年历史行情

阅读此文需要一定的占星基础知识,本人对于金融知识了解甚少,如有描述错误请包涵指正!影响大众事件发展趋势的都是外行星,即木星-冥王星这5颗,由于时间跨度长达30年,绘制社会行星的K线图工作量太大,所以只以时代行星对这30年行情的简单解读作为分享,在今后的短期分析中会逐渐加入社会行星,甚至在个股分析上还会加入个人行星。那即使只绘制时代行星,所展现出来的信息也无法在一张图上画出来,否则太乱难以分辨,所以...

weixin_39831242的博客 1675

Feature ‘alsa‘ was enabled, but the pre-condition ‘config.unix && !config.qnx && libs.alsa‘ failed解决

这个问题主要是Qt多媒体插件中缺少了ALSA音频库,所以我们需要自行先编译ALSA 在执行./configure的时候,配置项中ALSA为no Qt Multimedia: ALSA ................................... no GStreamer 1.0 .......................... no GStreamer 0.10 ......................... no Video for Linux .............

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 2587

工业质检升级!C#上位机集成YOLOv8.3.138+Blob分析:尺寸测量+缺陷检测一步到位

工业场景的技术选型,从来不是“选最先进的”,而是“选最适配的”。这个项目的成功,不在于采用了多前沿的技术,而在于找对了“贴合场景的技术组合”和“落地导向的实施思路”。C#上位机的稳定性保障了系统长期运行,YOLOv8.3.138的精度解决了缺陷检测痛点,Blob分析的抗干扰能力确保了尺寸测量准确,三者结合实现了“1+1+1>3”的效果。先摸透场景,再选技术:不要盲目追求最新模型,先深入了解车间环境、生产节奏、精度要求,选择兼容性强、稳定性高的技术方案;数据质量决定模型性能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 611

QNX系统中的密码哈希格式——数据安全深度分析

综上所述,QNX系统中的Shadowed密码哈希格式提供了一种有效的数据安全机制,能够保护用户密码的安全性。通过将用户密码的哈希值存储在系统文件中,并结合哈希算法和盐值的使用,可以有效地防止明文密码泄露和密码破解。密码哈希是一种常用的安全技术,用于将用户密码转换为不可逆的哈希值,以保护用户的敏感信息。在QNX操作系统中,存在一种称为Shadowed密码哈希格式的机制,用于存储用户密码的安全散列值。当用户登录系统时,系统会将用户输入的密码与保存的哈希值进行比对,以验证密码的正确性。在上述代码中,首先使用。

UneDatabase的博客 252

135、转动惯量辨识方法

<think>我们要求根据内容生成≤150字的文章摘要。内容是关于电机控制中转动惯量辨识的方法和工程经验。摘要需简洁概括核心:转动惯量重要性、三种方法(加减速法、正弦扫频、MRAS)、工程注意点(摩擦补偿、采样同步等)、实用建议(组合使用、滤波限幅、安全保护)。字数严格≤150。需要提炼。</think>转动惯量辨识是电机控制的关键,负载变化会导致速度环失稳。工程常用加减速法(简单可靠)、正弦扫频法(高精度)、MRAS在线辨识。实操需补偿摩擦、同步采样、控制激励幅度。建议混合使用,辨识结果需滤波限幅,并设置

2401_88858637的博客 40

用 CL_SALV_TREE 把层级数据做成一棵会呼吸的 ABAP ALV 树:从类继承扫描到事件交互的完整拆解

本文介绍了SAP ABAP中使用CL_SALV_TREE实现树形ALV报表的方法。该技术将层级数据(如类继承关系)以可展开/折叠的树形结构展示,解决了传统ALV Grid无法直观显示层次结构的问题。核心实现采用"数据表+层级表"分离的设计模式:数据表存储节点业务信息,层级表维护父子关系。通过add_node方法动态构建树形结构,支持设置节点文本、图标和事件。文中提供了完整示例代码,演示了如何递归扫描ABAP类继承关系并构建树形ALV,这种技术特别适用于展示类族谱、权限树等层级数据,能显著

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 206

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 高性能服务器程序框架
下一篇: select , poll , epoll I/O Multiplexing(I/O多路复用)
Tony L.Du
博客等级 码龄11年 73粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值