栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

strongswan面向对象

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

strongswan面向对象

目录

概述

源代码

代码中数据结构与面向对象关系

使用


概述

strongswan是C语言实现的,但数据结构,函数接口都是面向对象的思想;

比如C++的基类和派生类,父类和子类,私有成员变量和公有成员函数等。

源代码

第一遍翻代码看很不习惯,通览整个工程后就觉得这种面向对象的封装特别适合处理网络数据包。

下面以library举例,下列代码中为减少篇幅,故意删节部分字段

strongswan/src/libstrongswan/library.c

strongswan/src/libstrongswan/library.h

strongswan/src/libstrongswan/library.c

//cut off many codes
typedef struct private_library_t private_library_t;


struct private_library_t {

        
        library_t public;

        
        hashtable_t *objects;

        
        refcount_t ref;
};


void library_deinit()
{
        private_library_t *this = (private_library_t*)lib;

        if (!this || !ref_put(&this->ref))
        {       
                return;
        }

        free(this->public.conf);
        free((void*)this->public.ns);
        free(this);
        lib = NULL;
}

METHOD(library_t, get, void*,
        private_library_t *this, char *name)
{
        return this->objects->get(this->objects, name);
}

METHOD(library_t, set, bool,
        private_library_t *this, char *name, void *object)
{
        if (object)
        {
                if (this->objects->get(this->objects, name))
                {
                        return FALSE;
                }
                this->objects->put(this->objects, name, object);
                return TRUE;
        }
        return this->objects->remove(this->objects, name) != NULL;
}

bool library_init(char *settings, const char *namespace)
{
        private_library_t *this;

        if (lib)
        {       
                this = (private_library_t*)lib;
                ref_get(&this->ref);
                return !this->init_failed;
        }

        INIT(this,
                .public = {
                        .get = _get,
                        .set = _set,
                        .ns = strdup(namespace ?: "libstrongswan"),
                        .conf = strdupnull(settings ?: (getenv("STRONGSWAN_CONF") ?: STRONGSWAN_CONF)),
                },
                .ref = 1,
        );
        lib = &this->public;


        return !this->init_failed;
}

strongswan/src/libstrongswan/library.h

typedef struct library_t library_t;


struct library_t {

        
        void* (*get)(library_t *this, char *name);

        
        bool (*set)(library_t *this, char *name, void *object);

        
        char *conf;

        
        settings_t *settings;

        
        integrity_checker_t *integrity;

};


bool library_init(char *settings, const char *namespace);


void library_deinit();


extern library_t *lib;

代码中数据结构与面向对象关系

基类:

struct library_t

派生类:

struct private_library_t

构造函数:

bool library_init(char *settings, const char *namespace);

library_init函数内还有INIT,和成员的初始化等工作。

析构函数:

void library_deinit();

Public成员函数:

METHOD(library_t, get, void*, private_library_t *this, char *name);

METHOD(library_t, set, bool, private_library_t *this, char *name, void *object);

Private成员变量:

refcount_t ref;  等

使用

以swanctl使用library为例,

int main(int argc, char *argv[])
{
    atexit(cleanup);
    if (!library_init(NULL, "swanctl"))
    {
        exit(SS_RC_LIBSTRONGSWAN_INTEGRITY);
    }
    if (lib->integrity &&
        !lib->integrity->check_file(lib->integrity, "swanctl", argv[0]))
    {
        fprintf(stderr, "integrity check of swanctl failedn");
        exit(SS_RC_DAEMON_INTEGRITY);
    }
    if (!lib->plugins->load(lib->plugins,
            lib->settings->get_str(lib->settings, "swanctl.load", PLUGINS)))
    {
        exit(SS_RC_INITIALIZATION_FAILED);
    }

    swanctl_dir = strdup(getenv("SWANCTL_DIR") ?: SWANCTLDIR);

    dbg_default_set_level(0);
    lib->processor->set_threads(lib->processor, 4);
    dbg_default_set_level(1);

    return command_dispatch(argc, argv);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768610.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号