【Linux高性能服务器编程】——高性能服务器框架

这篇具有很好参考价值的文章主要介绍了【Linux高性能服务器编程】——高性能服务器框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux

hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之高性能服务器框架介绍,在这篇文章中,你将会学习到高效的创建自己的高性能服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!!

希望这篇文章能对你有所帮助【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux,大家要是觉得我写的不错的话,那就点点免费的小爱心吧!【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux注:这章对于高性能服务器的架构非常重要哟!!!

【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux         

目录

 一.服务器模型

    1.1 C/S模型

C/S模型的组成

C/S模型的通信过程

1.2 P2P模型

Linux 中的服务器 P2P 模型

二. 两种高效的服务器事件处理

2.1 Reactor模式

Linux 中的 Reactor 模式

2.2. Proactor模式

Linux 中的 Proactor 模式

 一.服务器模型

    1.1 C/S模型

C/S模型,即客户端/服务器模型(Client/Server Model),是一种网络计算模型,它将任务和工作负载分配到客户端和服务器两个不同的计算环境中。在这种模型中,客户端负责发送请求,而服务器负责处理请求并返回响应。

如图:【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux 

C/S模型的组成

  1. 客户端(Client)

    • 客户端通常是用户直接交互的应用程序,例如网页浏览器、电子邮件客户端或移动应用。
    • 它向服务器发送请求,并接收服务器返回的数据。
    • 客户端可以执行一些计算任务,但主要依赖于服务器来处理复杂或数据密集型的任务。
  2. 服务器(Server)

    • 服务器是一个提供数据存储和服务的系统,它响应客户端的请求。
    • 服务器通常拥有强大的计算能力和存储空间,能够处理多个客户端的请求。
    • 服务器可以运行数据库管理系统,如 MySQL 或 PostgreSQL,以及各种服务器软件,如 HTTP 服务器 Apache 或 Nginx。

C/S模型的通信过程

  1. 请求:客户端建立一个到服务器的连接,并发送一个请求。
  2. 处理:服务器接收到请求后,对其进行处理。
  3. 响应:服务器将处理结果作为响应发送回客户端。
  4. 关闭连接:客户端接收响应后,通常关闭与服务器的连接

我们可以使用多线程来进行实现,一个连接的业务处理分配一个线程:

【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux 

核心代码如下:

线程处理函数:

// 定义线程函数
void *handle_client(void *socket_desc) {
    int sock = *(int*)socket_desc;
    char *message;
    int len;

    // 接收客户端数据
    while((len = read(sock, message, 1024)) > 0) {
        printf("收到数据:%s\n", message);
        // 发送响应
        write(sock, "Hello, Client!", 14);
        memset(message, 0, 1024);
    }

    // 关闭套接字
    close(sock);
    return 0;
}

 主函数:

​
int main() {
    int sock, newsock, clilen;
    struct sockaddr_in serv_addr, cli_addr;
    int *new_sock;
    pthread_t thread_id;

    // 创建套接字
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        printf("Could not create socket");
    }

    // 填充服务器地址结构
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(8080);

    // 绑定套接字到地址
    if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        perror("bind failed");
        return -1;
    }

    // 监听套接字
    listen(sock, 3);
    printf("Listening...\n");
    clilen = sizeof(cli_addr);

    // 接受客户端连接
    while((newsock = accept(sock, (struct sockaddr *)&cli_addr, (socklen_t*)&clilen)) > 0) {
        // 创建新线程
        new_sock = malloc(1);
        *new_sock = newsock;
        if (pthread_create(&thread_id, NULL, handle_client, (void*)new_sock) < 0) {
            perror("could not create thread");
            return -1;
        }
        pthread_detach(thread_id);
    }

    // 关闭套接字
    if (newsock < 0) {
        perror("accept failed");
        return -1;
    }

    return 0;
}

​

 

1.2 P2P模型

在 Linux 环境中,P2P(点对点)模型是一种直接连接两个或多个计算机的网络通信方式,其中没有中心服务器参与数据传输。在 P2P 模型中,每个节点既是客户端也是服务器,可以相互发送和接收数据。

Linux 中的服务器 P2P 模型

  1. 节点间通信

    • P2P 网络中的每个节点都直接与其他节点通信,没有中央服务器来处理连接和数据传输。
    • 节点之间通过套接字(sockets)进行通信,可以建立全双工连接。
  2. 网络拓扑

    • P2P 网络可以是星型、网状或混合型,取决于节点的连接方式和网络结构。
    • 节点可以通过各种机制发现其他节点,如 DHT(分布式哈希表)算法。

如图:

【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux

代码和C/S相似,大家可以去网上自行寻找资料,这里就不再重复了哦!

二. 两种高效的服务器事件处理

2.1 Reactor模式

Reactor 模式是一种事件驱动的网络编程模式,用于处理高并发网络服务。在 Reactor 模式中,一个或多个线程负责监听网络事件,当事件发生时,例如新的连接请求、数据到达等,Reactor 模式会触发相应的处理函数来处理这些事件。

Linux 中的 Reactor 模式

  1. 事件循环

    • Reactor 模式通常包含一个事件循环,该循环不断地轮询所有事件,等待事件发生并处理它们。
  2. 事件处理器

    • 事件处理器是处理特定事件的函数,它们通常与事件类型相关联。
  3. 事件分派器

    • 事件分派器负责将事件分发给相应的事件处理器。
  4. 事件源

    • 事件源是产生事件的实体,例如网络套接字、文件描述符等。

流程图如下:

【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux  

使用的是同步I/O模型。

1) 主线程往epol l 内核事件表中注册socket上的读就绪事件。

2) 主线程调用epol l _ wait等待 socket 上有数据可读。 

3)当socket 上有数据可读时, epoll _ wait通知主线程。主线程则将socket 可读事件放入请求队列。  

4)睡眠在请求队列上的某个工作线程被唤醒,它从 socket 读取数据,并处理客户请求,然后往epol l内核事件表中注册该socket 上的写就绪事件。

5) 主线程调用epoll _ wait等待 socket 可写。

6)当socket 可写时, epoll wait通知主线程。主线程将socket 可写事件放入请求队列。 

7)睡眠在请求队列上的某个工作线程被唤醒,它往socket上写入服务器处理客户请求的结果。
 

 

2.2. Proactor模式

Proactor 模式是一种事件驱动的网络编程模式,与 Reactor 模式类似,但它使用异步 I/O 操作来处理网络事件。在 Proactor 模式中,一个或多个线程负责监听网络事件,当事件发生时,例如新的连接请求、数据到达等,Proactor 模式会触发相应的处理函数来处理这些事件。

Linux 中的 Proactor 模式

  1. 事件循环

    • Proactor 模式通常包含一个事件循环,该循环不断地轮询所有事件,等待事件发生并处理它们。
  2. 事件处理器

    • 事件处理器是处理特定事件的函数,它们通常与事件类型相关联。
  3. 事件分派器

    • 事件分派器负责将事件分发给相应的事件处理器。
  4. 事件源

    • 事件源是产生事件的实体,例如网络套接字、文件描述符等。
  5. 异步 I/O 操作

    • Proactor 模式使用异步 I/O 操作来处理网络事件,这样可以减少线程间的上下文切换,提高系统的性能。

 具体流程图如下:

【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux

1)主线程调用aio _ read 函数向内核注册socket 上的读完成事件, 并告诉内核用户读缓冲区的位置,以及读操作完成时如何通知应用程序(这里以信号为例,详情请参考sigevent的man手册)。

2)主线程继续处理其他逻辑。 

3)当socket上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据已经可用。  

4)应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求之后,调用aio _ write函数向内核注册 socket上的写完成事件, 并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序(仍然以信号为例)。

5)主线程继续处理其他逻辑。  

6)当用户缓冲区的数据被写入socket之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕。  

7)应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭 socket。

 这里给出一个代码例子:

事件处理函数:

// 事件处理函数
void *handle_connection(void *socket_desc) {
    int sock = *(int*)socket_desc;
    char *message;
    int len;

    // 接收客户端数据
    while((len = read(sock, message, 1024)) > 0) {
        printf("收到数据:%s\n", message);
        // 发送响应
        write(sock, "Hello, Client!", 14);
        memset(message, 0, 1024);
    }

    // 关闭套接字
    close(sock);
    return 0;
}

循环逻辑:

 while(1) {
        activity = epoll_wait(epollfd, events, MAX_EVENTS, -1);
        if ((activity < 0) && (errno != EINTR)) {
            printf("epoll_wait error");
            return -1;
        }

        for (i = 0; i < activity; i++) {
            if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP) || (!(events[i].events & EPOLLIN))) {
                // 处理错误情况
                close(events[i].data.fd);
                continue;
            }

            if (events[i].data.fd == sock) {
                // 有新的客户端连接
                newsock = accept(sock, (struct sockaddr *)&cli_addr, (socklen_t*)&clilen);
                printf("新的客户端连接:%s\n", inet_ntoa(cli_addr.sin_addr));
                client_sockets[i] = newsock;
                event.events = EPOLLIN;
                event.data.fd = newsock;
                if (epoll_ctl(epollfd, EPOLL_CTL_ADD, newsock, &event) == -1) {
                    perror("epoll_ctl failed");
                    return -1;
                }
            } else {
                // 处理客户端数据
                new_sock = malloc(1);
                *new_sock = events[i].data.fd;
                if (pthread_create(&thread_id, NULL, handle_connection, (void*)new_sock) < 0) {
                    perror("could not create thread");
                    return -1;
                }
                pthread_detach(thread_id);
            }
        }
    }

    // 关闭 epoll 实例
    close(epollfd);

    return 0;
}

在这个例子中,服务器端使用 epoll 函数来实现 Proactor 模式,创建一个简单的服务器。服务器使用 pthread 库来创建多线程来处理多个客户端的连接,每个连接都由一个单独的线程处理。服务器收到客户端的请求后,发送一个响应,并关闭与客户端的连接。(不是完整代码哦!)

   好啦!到这里这篇文章就结束啦,关于实例代码中我写了很多注释,如果大家还有不懂得,可以评论区或者私信我都可以哦【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux!! 感谢大家的阅读,我还会持续创造网络编程相关内容的,记得点点小爱心和关注哟!【Linux高性能服务器编程】——高性能服务器框架,服务器,运维,网络,c++,linux     文章来源地址https://www.toymoban.com/news/detail-857806.html

到了这里,关于【Linux高性能服务器编程】——高性能服务器框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux高性能服务器编程——学习笔记①

    第一章有一些概念讲的很好,值得好好关注一下!!! 1.1 主要的协议 1.1.1 数据链路层 ​ 数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网、令牌环)上的传输。 ​ 常用的协议有两种: ARP协议(Address Resolve Protocol,地址解析协议) RARP(Reverse

    2024年01月20日
    浏览(38)
  • Linux高性能服务器编程——ch10笔记

    信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。 :::tips int kill(pid_t pid, int sig); ::: kill函数:一个进程给其他进程发送信号的API。 sig一般大于0,如果设为0则表示不发送信号,可以用来检测进程或进程组是否存在。由于进程P

    2024年02月06日
    浏览(24)
  • Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

    我们将从以下3方面讨论Linux网络API: 1.socket地址API。socket最开始的含义是一个IP地址和端口对(ip,port),它唯一表示了使用TCP通信的一端,本书称其为socket地址。 2.socket基础API。socket的主要API都定义在sys/socket.h头文件中,包括创建socket、命名socket、监听socket、接受连接、发

    2024年02月07日
    浏览(31)
  • Linux高性能服务器编程 学习笔记 第二章 IP协议详解

    本章从两方面探讨IP协议: 1.IP头部信息。IP头部出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,指定部分通信行为。 2.IP数据报的路由和转发。IP数据报的路由和转发发生在除目标机器外的所有主机和路由器上,它们决定数据报是否应

    2024年02月09日
    浏览(20)
  • 【linux高性能服务器编程】项目实战——仿QQ聊天程序源码剖析

    hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之项目实战——仿QQ聊天程序源码剖析,在这篇文章中, 你将会学习到如何利用Linux网络编程技术来实现一个简单的聊天程序,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了

    2024年04月28日
    浏览(23)
  • Linux高性能服务器编程 学习笔记 第一章 TCP/IP协议族

    现在Internet使用的主流协议族是TCP/IP协议族,它是一个分层、多协议的通信体系。 TCP/IP协议族包含众多协议,我们只详细讨论IP协议和TCP协议,因为它们对编写网络应用程序有最直接的影响。如果想系统学习网络协议,RFC(Request For Comments,评论请求)是首选资料。 TCP/IP协议

    2024年02月09日
    浏览(38)
  • Linux高性能服务器编程|阅读笔记:第6章 - 高级I/O函数

    Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~   ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿

    2024年02月03日
    浏览(18)
  • Linux高性能服务器编程|阅读笔记:第1章 - TCP/IP协议族

    Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~   ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做

    2024年02月01日
    浏览(28)
  • 强推Linux高性能服务器编程, 真的是后端开发技术提升, 沉淀自身不容错过的一本经典书籍

    目录 第1章 TCP/IP协议 1.1 TCP/IP协议族体系结构以及主要协议 1.1.1 数据链路层 1.1.2 网络层 1.1.3 传输层 1.1.4 应用层 1.2 封装 1.3 分用 1.5 ARP协议工作原理 1.5.1 以太网ARP请求/应答报文详解 1.5.2 ARP高速缓存的查看和修改 1.5.3 使用tcpdump观察ARP通信过程所得结果如下 本篇核心关键所在

    2024年02月07日
    浏览(26)
  • 【网络编程】高性能并发服务器源码剖析

      hello !大家好呀! 欢迎大家来到我的网络编程系列之洪水网络攻击,在这篇文章中, 你将会学习到在网络编程中如何搭建一个高性能的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!! 希望这篇文章能

    2024年04月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包