【slighttpd】基于lighttpd架构的Server项目实战(10)—插件&动态库

上一节我们介绍了状态机,本节我们将添加插件模块,之后就可以根据公共接口来开发插件,而我们的server则只需要通过状态机调用相应阶段的公共函数,无需关心插件的实现细节。我们的插件将以动态库so的形式来加载。

插件

我们的插件类将作为一个基类,成员函数作为虚函数,之后由插件开发者继承、实现。

本项目的插件接口对应于状态机的阶段,每个阶段提供一个函数:

/*************************************************************************
    > File Name: plugin.h
    > Author: Jiange
    > Mail: jiangezh@qq.com 
    > Created Time: 2016年02月10日 星期三 18时46分22秒
 ************************************************************************/

#ifndef _PLUGIN_H
#define _PLUGIN_H

class Worker;
class Connection;

typedef enum
{
    PLUGIN_READY,
    PLUGIN_NOT_READY,
    PLUGIN_ERROR
} plugin_state_t;

class Plugin
{
    public:
        Plugin();
        virtual ~Plugin();

        virtual bool Init(Connection *con, int index);
        virtual bool RequestStart(Connection *con, int index);
        virtual bool Read(Connection *con, int index);
        virtual bool RequestEnd(Connection *con, int index);
        virtual bool ResponseStart(Connection *con, int index);
        virtual plugin_state_t Write(Connection *con, int index);
        virtual bool ResponseEnd(Connection *con, int index);
        virtual void Close(Connection *con, int index);

        virtual bool Trigger(Worker* worker, int index);
        virtual bool LoadPlugin(Worker* worker, int index);
        virtual void FreePlugin(Worker* worker, int index);

        typedef Plugin* (*SetupPlugin)();
        typedef void    (*RemovePlugin)(Plugin *plugin);

        SetupPlugin setup_plugin;
        RemovePlugin remove_plugin;

        void* plugin_data;
        void* plugin_so;
        int   plugin_index;
        bool  plugin_is_loaded;
};

#endif

动态库加载

const char *path = so_path; //动态库so的路径

/* dlopen()函数以指定模式打开指定的动态链接库文件,
 * 并返回一个句柄给dlsym()的调用进程。
 * 使用dlclose()来卸载打开的库。
 * 头文件#include <dlfcn.h>
 * RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析
 * (只对函数引用有效,对于变量引用总是立即解析)。
 */
void *so = dlopen(path, RTLD_LAZY);
if (!so)
{
    std::cerr << dlerror() << std::endl;
    return false;
}

/* void* dlsym(void* handle,const char* symbol)
 * 根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的地址。
 * 使用这个函数不但可以获取函数地址,也可以获取变量地址。
 * handle:由dlopen打开动态链接库后返回的指针;
 * symbol:要求获取的函数或全局变量的名称。
 * SetupPlugin和RemovePlugin是插件模块中的函数;
 * SetupPlugin返回一个动态分配的插件对象;
 * RemovePlugin释放插件对象的内存空间。
 */
Plugin::SetupPlugin setup_plugin = (Plugin::SetupPlugin)dlsym(so, "SetupPlugin");

Plugin::RemovePlugin remove_plugin = (Plugin::RemovePlugin)dlsym(so, "RemovePlugin");

if (!setup_plugin || !remove_plugin)
{
    std::cerr << dlerror() << std::endl;
    dlclose(so);
    return false;
}

//根据上面取得的函数句柄,获取插件对象
Plugin *plugin = setup_plugin();

if (!plugin)
{
    //卸载打开的库
    dlclose(so);
    return false;
}

//……

return true;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lighttpd是一个轻量级的Web服务器软件,而ONVIF是一种用于视频监控设备的网络协议。 开发lighttpd的ONVIF插件,可以使lighttpd服务器具备与视频监控设备进行通信和交互的功能。 在开发该插件时,需要考虑以下几个方面: 1. ONVIF协议解析:插件需要能够解析ONVIF协议中的请求和响应,以便与监控设备进行通信。可以使用相关的开源或自行编写解析代码。 2. 设备发现与管理:插件需要实现设备的自动发现功能,以便与已连接到网络上的监控设备建立连接。同时,还需要支持设备的管理功能,如添加、删除、修改设备等。 3. 视频流传输:插件需要能够接收和传输监控设备的视频流。可以使用相关的编解码,将设备发送的视频流进行解码后再传输给客户端。 4. 权限验证与安全性:插件需要实现用户权限验证机制,以确保只有授权的用户能够访问和操作监控设备。同时,还需要考虑数据传输的安全性,如使用HTTPS等安全协议进行通信。 5. 插件配置与管理:插件需要提供一些配置选项,以便用户能够根据自己的需求进行设置。同时,插件也需要提供相应的管理界面,方便用户进行配置和管理。 开发lighttpd的ONVIF插件需要一定的编程经验和相关的技术知识,如网络编程、协议解析、视频流处理等。同时,还需要对lighttpd服务器的原理和架构有一定的了解,以便将插件与服务器进行集成。 通过开发lighttpd的ONVIF插件,可以使得lighttpd服务器具备与视频监控设备进行通信和交互的能力,为用户提供更加丰富和灵活的视频监控解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值