百万并发连接的实践测试02

简介: 百万并发连接的实践测试02

本次主要解决上次遗留的数据结构问题

代码部分

头文件

#ifndef STRUCT_H_
#define STRUCT_H_
#include <stdio.h>
#define BUFFER_LENGTH       1024
#define EPOLL_LENGTH        1024
typedef struct conn_item conn_item_t;
typedef struct conn_block conn_block_t;
typedef struct reactor_node reactor_node_t;
int reactor_init(reactor_node_t* reactor);
void reactor_dest(reactor_node_t* reactor);
int reactor_block_connect(reactor_node_t* reactor);
int reactor_item_connect(reactor_node_t* reactor, int fd);
#endif

源文件

#include "struct.h"
#include <stdlib.h>
#include <string.h>
typedef struct conn_item
{
    int fd;
    char wbuffer[BUFFER_LENGTH];
    int wc;
    char rbuffer[BUFFER_LENGTH];
    int rc;
} conn_item_t;
typedef struct conn_block
{
    struct conn_item* conntions;
    struct conn_block* next;
} conn_block_t;
typedef struct reactor_node
{
    int epfd;
    int blcnt;
    struct conn_block* block_heander;
} reactor_node_t;
int reactor_init(reactor_node_t* reactor)
{
    if(!reactor)
        return -1;
    reactor->block_heander = malloc(sizeof(conn_block_t) + EPOLL_LENGTH * sizeof(conn_item_t));
    if(reactor->block_heander == NULL)
        return -1;
    reactor->block_heander->next = NULL;
    reactor->block_heander->conntions = (conn_item_t*)(reactor->block_heander + 1);
    reactor->blcnt = 1;
    reactor->epfd = epoll_create(1);
}
void reactor_dest(reactor_node_t* reactor)
{
    if(!reactor)
        return;
    if(!reactor->block_heander)
        free(reactor->block_heander);
    close(reactor->epfd);
}
int reactor_block_connect(reactor_node_t* reactor)
{
    if(!reactor)
        return -1;
    conn_block_t* block = malloc(sizeof(conn_block_t) + EPOLL_LENGTH * sizeof(conn_item_t));
    if(block == NULL)
        return -1;
    conn_block_t* temp = reactor->block_heander;
    while(temp->next != NULL)
        temp = temp->next;
    temp->next = block;
    block->conntions = (conn_item_t*)(block + 1);
    reactor->blcnt++;
    return 0;
}
int reactor_item_connect(reactor_node_t* reactor, int fd)
{
    int i = 0;
    if(!reactor)
        return -1;
    int pos = fd / EPOLL_LENGTH;
    while(pos > reactor->blcnt)
    {
        reactor_block_connect(reactor);
    }
    conn_block_t* blk = reactor->block_heander;
    for(; i < pos; i++)
    {
        blk = blk->next;
    }
    int idx = fd % EPOLL_LENGTH;
    blk->conntions[pos].fd = fd;
    memset(blk->conntions[pos].rbuffer, 0, BUFFER_LENGTH);
    memset(blk->conntions[pos].wbuffer, 0, BUFFER_LENGTH);
    blk->conntions[pos].rc = 0;
    blk->conntions[pos].wc = 0;
    return 0;
}

数据结构示意图

代码解读

上次我们是搞了一个很大的数组,这次我们做出一些优化。把做出一个链式结构,一个链表头,下面有很多块。块里面是conn_item,一个块里面有1024个conn_item。

目录
打赏
0
0
0
0
32
分享
相关文章
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
98 4
利用 RunnerGo 深度探索 API 性能测试:从理论到实践
API性能测试是保障应用稳定性和用户体验的关键环节。本文详细探讨了如何使用RunnerGo全栈测试平台进行高效API性能测试,涵盖测试计划创建、场景设计、参数配置到执行与分析全过程。通过电商平台促销活动案例,展示了高并发下的测试策略与优化措施,如代码与数据库查询优化、数据库连接池扩容、服务器资源配置调整及缓存策略实施等。最终显著提升系统性能,满足高并发需求。API性能测试需持续关注与优化,以适应业务发展和用户需求变化。
76 33
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
【YashanDB 知识库】druid 连接池做断网测试,无法自动重新连接
【YashanDB 知识库】druid 连接池做断网测试,无法自动重新连接
利用Postman和Apipost进行API测试的实践与优化-动态参数
在API测试中,Postman和Apipost是常用的工具。Postman内置变量功能有限,面对复杂场景时需编写JavaScript脚本,增加了维护成本。而Apipost提供丰富的内置变量、可视化动态值配置和低代码操作,支持生成真实随机数据,如邮箱、手机号等,显著提升测试效率和灵活性。对于复杂测试场景,Apipost是更好的选择,能有效降低开发与维护成本,提高测试工作的便捷性和可维护性。
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
107 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
【YashanDB知识库】druid连接池做断网测试,无法自动重新连接
【YashanDB知识库】druid连接池做断网测试,无法自动重新连接
Socket.IO介绍,以及怎么连接测试Socket.IO接口?
Socket.IO 是一个用于浏览器和服务器间实时双向通信的库,支持低延迟消息传递、跨平台运行及自动重连。文章介绍了其特点与调试需求,并详细说明如何使用 Apifox 工具创建、连接、发送/接收 Socket.IO 事件,以及团队协作和调试技巧。掌握这些技能可提升实时应用开发效率与质量。
探索软件测试的深度与广度:从理论到实践
在数字化时代,软件已成为我们生活中不可或缺的一部分。随着技术的不断进步和用户需求的多样化,确保软件质量变得尤为重要。本文将深入浅出地介绍软件测试的核心概念、类型及其在软件开发生命周期中的重要性。我们将通过实际案例,展示如何实施有效的测试策略,并探讨自动化测试的未来趋势,旨在为读者提供一套完整的软件测试知识体系,帮助提升软件质量和开发效率。
探索软件测试的奥秘:从理论到实践
在软件开发的宇宙中,软件测试犹如一颗璀璨的星辰,指引着质量的方向。本文将带你穿梭于软件测试的理论与实践之间,揭示其内在的逻辑和魅力。从测试的重要性出发,我们将探讨不同类型的测试方法,并通过实际案例分析,深入理解测试用例的设计和应用。最后,我们将通过一个代码示例,展示如何将理论知识转化为实际操作,确保软件质量的同时,也提升你的测试技能。让我们一起踏上这段探索之旅,发现软件测试的无限可能。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等