热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POCOC++Libraies介绍及常见用法

POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai

  POCO C++ Libraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。

  POCO C++ Libraies由多个功能模块组成,其中包括网络、多线程、日志、命令行程序等。POCO官方拥有众多模块的使用示例,可以在短时间内上手并完成相关功能。

  官方网址:POCO官方
  官方文档:POCO文档
  函数用法:POCO函数用法




章节预览:

介绍(引自官方)
PocoNet
HTTP(TCP)服务器启动方式
HTTP(UDP)服务器启动方式
HTTP客户端编写方式
方法调用
DNS域名解析方式
PocoFoundation
Poco 日志(封装后的函数)
Poco 日志用法
Poco 智能指针用法
Poco json相关用法
Poco 获取当前时间
Poco 线程池用法
Poco 互斥锁用法
Poco 智能锁
Poco 智能锁用法
PocoUtil
Poco 控制台程序
Poco 控制台程序启动方式




章节内容:




介绍(引自官方):

  POCO C++库是开源C++类库的集合,这些库简化并加速了C++中以网络为中心的可移植应用程序的开发。这些库与C++标准库完美集成,并填补了它遗留的许多功能空白。它们的模块化,高效的设计和实现使POCO C++库非常适合嵌入式开发,因为C++编程语言同时适用于底层(设备I / O,中断处理程序等),因此C++编程语言正变得越来越流行。 。)和高级面向对象的开发。当然,POCO也已准备好应对企业级挑战。

  POCO由四个核心库和许多附加库组成。核心库是Foundation,XML,Util和Net。附加库中的两个是NetSSL(为Net库中的网络类提供SSL支持)和Data(一个用于统一访问不同SQL数据库的库)。POCO旨在实现以网络为中心的跨平台C++软件开发,而Apple的Cocoa则是用于Mac开发,而Ruby on Rails则是用于Web开发,这是一个功能强大且易于使用的有趣平台,可用于构建您的应用程序。POCO严格使用标准ANSI / ISO C++(包括标准库)构建。贡献者试图在使用高级C++功能与保持类可理解以及代码干净,一致和易于维护之间找到一个良好的平衡。




PocoNet:

  介绍:

    PocoNet属于网络相关框架,集成功能有:
      HTTP(TCP)服务器及客户端,HTTP(UDP)服务器以及DNS域名解析等。

    PocoNet常用头定义及命名空间:

      #include “Poco/Net/SocketAddress.h”
      #include “Poco/Net/StreamSocket.h”
      #include “Poco/Net/SocketStream.h”
      #include “Poco/StreamCopier.h”
      #include “Poco/Net/DNS.h”
      using Poco::Net::DNS;
      using Poco::Net::IPAddress;
      using Poco::Net::HostEntry;



    使用PocoNet框架需要包含库名:

      PocoFoundation
      PocoNet




  HTTP(TCP)服务器启动方式:

Poco::Net::ServerSocket srv("www.test.com",8080);
for ( ; ; )
{Poco::Net::StreamSocket ss &#61; srv.acceptConnection();Poco::Net::SocketStream str(ss);str <<"HTTP/1.0 200 OK\r\n""Content-Type: text/html\r\n""\r\n""""

Hello world

"<}



  HTTP(UDP)服务器启动方式&#xff1a;

Poco::Net::SocketAddress socketAddress("www.test.com",8080);
Poco::Net::DatagramSocket datagram(socketAddress); char buffer[1024];
for ( ; ; ){Poco::Net::SocketAddress sender;int n &#61; datagram.receiveFrom(buffer, sizeof(buffer) - 1, sender);buffer[n] &#61; &#39;\0&#39;;std::cout <



  HTTP客户端编写方式&#xff1a;


    .h文件

class LPoco
{public:
/*******************************************************************************///创建一个Tcp连接到服务器Poco::Net::SocketAddress LCtSocketToServer(std::string http,int port);//使用::Net::SocketStream类,它提供了一个I / O流StreamSocket接口Poco::Net::StreamSocket LRwStreamSocket(Poco::Net::SocketAddress socket);//format 流格式 比如xml ->/*str <<"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n";*///拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入std::ostream ostrvoid LCopyStream(Poco::Net::StreamSocket stream,std::string format,std::ostream & ostr, std::size_t bufferSize &#61; 8192);//拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入string ostrstd::string LCopyString(Poco::Net::StreamSocket stream,std::string format,std::string & ostr, std::size_t bufferSize &#61; 8192);
/********************************************************************************/
};


    .cpp文件

//创建一个Tcp连接到服务器
Poco::Net::SocketAddress LPoco::LCtSocketToServer(std::string http,int port)
{Poco::Net::SocketAddress sa(http, port);return sa;
}//使用::Net::SocketStream类,它提供了一个I / O流StreamSocket接口
Poco::Net::StreamSocket LPoco::LRwStreamSocket(Poco::Net::SocketAddress socket)
{Poco::Net::StreamSocket str(socket);return str;
}//format 流格式 比如xml ->/*str <<"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n";*///拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入ostr
void LPoco::LCopyStream(Poco::Net::StreamSocket stream,std::string format,std::ostream & ostr, std::size_t bufferSize)
{Poco::Net::SocketStream Socket(stream);Socket <}//拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入string ostr
std::string LPoco::LCopyString(Poco::Net::StreamSocket stream,std::string format,std::string & ostr, std::size_t bufferSize)
{Poco::Net::SocketStream Socket(stream);Socket <}

    方法调用&#xff1a;

LPoco m_poco;Poco::Net::SocketAddress stream &#61; m_poco.LCtSocketToServer("www.test.com", 8080);Poco::Net::StreamSocket socket &#61; m_poco.LRwStreamSocket(stream);std::string ostr;m_poco.LCopyString(socket,"GET / HTTP/1.1\r\n""Host: www.test.com\r\n""\r\n",ostr);std::cout <

    DNS域名解析方式&#xff1a;

const HostEntry& entry &#61; DNS::hostByName("www.appinf.com");
//获取别名
const HostEntry::AliasList& aliases &#61; entry.aliases();
HostEntry::AliasList::const_iterator it &#61; aliases.begin();
int nNum &#61; 0;
for (; it !&#61; aliases.end(); &#43;&#43;it)
{std::cout <<"Alias: " <<*it <<"" <<&#43;&#43;nNum <}
//获取地址
nNum &#61; 0;
const HostEntry::AddressList& addrs &#61; entry.addresses();
HostEntry::AddressList::const_iterator it1 &#61; addrs.begin();
for (; it1 !&#61; addrs.end(); &#43;&#43;it1)
{std::cout <<"Address: " <toString() <<" " <}



PocoFoundation&#xff1a;

  介绍(引自官方)&#xff1a;

    PocoFoundation是POCO的核心。它包含基础平台抽象层以及常用的实用程序类和功能。Foundation库包含用于固定大小整数的类型&#xff0c;用于在字节顺序之间转换整数的函数&#xff0c;Poco :: Any类&#xff08;基于boost :: Any&#xff09;&#xff0c;用于错误处理和调试的实用程序&#xff0c;包括各种异常类和对断言的支持。还提供了许多用于内存管理的类&#xff0c;包括基于引用计数的智能指针&#xff0c;以及用于缓冲区管理和内存池的类。对于字符串处理&#xff0c;POCO包含许多功能&#xff0c;其中包括修剪字符串&#xff0c;执行不区分大小写的比较和大小写转换。还可以通过类的形式获得对Unicode文本的基本支持&#xff0c;这些类可以在不同的字符编码&#xff08;包括UTF-8和UTF-16&#xff09;之间转换文本。那里支持格式化和解析数字&#xff0c;包括sprintf的类型安全变体。还提供了基于众所周知的PCRE库&#xff08;http://www.pcre.org&#xff09;的正则表达式。



    PocoFoundation常用头定义&#xff1a;

      #include “Poco/Logger.h”
      #include “Poco/AutoPtr.h”
      #include “Poco/ConsoleChannel.h”
      #include “Poco/PatternFormatter.h”
      #include “Poco/FormattingChannel.h”
      #include “Poco/SimpleFileChannel.h”
      #include “Poco/LocalDateTime.h”
      #include “Poco/Message.h”



    使用PocoFoundation框架需要包含库名&#xff1a;

      PocoFoundation




  Poco日志(封装后的函数)&#xff1a;


    .h文件

#include "Poco/Logger.h"
#include "Poco/AutoPtr.h"
#include "Poco/ConsoleChannel.h"
#include "Poco/PatternFormatter.h"
#include "Poco/FormattingChannel.h"
#include "Poco/SimpleFileChannel.h"
#include "Poco/LocalDateTime.h"
#include "Poco/Message.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include #define PATH "/works/examples"
#define NAME "poco_log"
#define SUFFIX ".log"//日志是否有效写入&#xff0c;如果为false直接返回
#define LOGVALID truevoid init_logger(const std::string app_name,const std::string app_version,bool use_console_log &#61; true,bool file_log &#61; true,const std::string target &#61; "./log",std::string loglevel &#61; "information",int64_t rotation_size &#61; 10 * 1024 * 1024,bool auto_flush &#61; true);struct LoggerInfo
{std::string app_name;std::string app_version;bool use_console_log;bool file_log;std::string target;std::string loglevel;int64_t rotation_size;bool auto_flush;
};class poco_log
{public:poco_log();//传入日志路径和名称&#xff0c;其中日志路径可以为空poco_log(std::string path,std::string name);poco_log(LoggerInfo log);void fatal(std::string str);void critical(std::string str);void error(std::string str);void warning(std::string str);void debug(std::string str);void trace(std::string str);void information(std::string str);void notice(std::string str);void init(LoggerInfo log);public:Poco::Logger & m_logger &#61; Poco::Logger::root();Poco::AutoPtr m_Channel;Poco::AutoPtr m_patternFormatter;Poco::AutoPtr m_formattingChannel;LoggerInfo m_logInfo;
};static LoggerInfo g_logger;void LOGE(std::string logs,std::string type &#61; "");
void LOGE_Fmt(const char *fmt, ...);
void LOGE_Fmt_Type(std::string type,const char *fmt, ...);
void LOGD(std::string logs,std::string type &#61; "");
void LOGD_Fmt(const char *fmt, ...);
void LOGD_Fmt_Type(std::string type,const char *fmt, ...);
void LOGW(std::string logs,std::string type &#61; "");
void LOGW_Fmt(const char *fmt, ...);
void LOGW_Fmt_Type(std::string type,const char *fmt, ...);
void LOGC(std::string logs,std::string type &#61; "");
void LOGC_Fmt(const char *fmt, ...);
void LOGC_Fmt_Type(std::string type,const char *fmt, ...);
void LOGF(std::string logs,std::string type &#61; "");
void LOGF_Fmt(const char *fmt, ...);
void LOGF_Fmt_Type(std::string type,const char *fmt, ...);
void LOGI(std::string logs,std::string type &#61; "");
void LOGI_Fmt(const char *fmt, ...);
void LOGI_Fmt_Type(std::string type,const char *fmt, ...);
void LOGN(std::string logs,std::string type &#61; "");
void LOGN_Fmt(const char *fmt, ...);
void LOGN_Fmt_Type(std::string type,const char *fmt, ...);
void LOGT(std::string logs,std::string type &#61; "");
void LOGT_Fmt(const char *fmt, ...);
void LOGT_Fmt_Type(std::string type,const char *fmt, ...);
//获取日志对象
poco_log *GetLogObj(std::string type);
//创建日志类型
poco_log *CreateLogObj(std::string type);
//释放所有日志对象
void FreeLogObjs();


    .cpp文件

/**
* 李坤昱
*/
static bool g_bValid &#61; false;
static std::string defaltName;
std::map Llogs;poco_log::poco_log()
{}poco_log::poco_log(LoggerInfo log):m_logInfo(log)
{}void poco_log::init(LoggerInfo log)
{m_logInfo &#61; log;if (log.use_console_log)m_Channel &#61; new Poco::ConsoleChannel;else{m_Channel &#61; new Poco::SimpleFileChannel;char StrFormat[256] &#61; {0};Poco::LocalDateTime local;local.utcTime();sprintf(StrFormat,"%s%s%d%02d%02d%02d%02d%02d%s",log.target.c_str(),log.app_name.c_str(),local.year(),local.month(),local.day(),local.hour(),local.minute(),local.second(),SUFFIX);std::string logname(StrFormat);m_Channel->setProperty("path",logname);memset(StrFormat,0,sizeof(StrFormat));sprintf(StrFormat,"%d M",log.rotation_size / 1024 / 1024);m_Channel->setProperty("rotation", StrFormat);}//m_patternFormatter &#61; new Poco::PatternFormatter("[%Y-%n-%e %H:%M:%S] [%U(%u)] %p: %t");m_patternFormatter &#61; new Poco::PatternFormatter("[%Y-%n-%e %H:%M:%S] [%p]: %t");m_patternFormatter->setProperty("times", "local"); // 格式化中的时间显示为本地时间m_formattingChannel &#61; new Poco::FormattingChannel(m_patternFormatter, m_Channel);m_logger.setLevel(log.loglevel);m_logger.setChannel(m_formattingChannel);g_bValid &#61; true;
}void poco_log::error(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.error(str);}}void poco_log::debug(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.debug(str);}
}void poco_log::fatal(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.fatal(str);}
}void poco_log::warning(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.warning(str); }
}void poco_log::trace(std::string str)
{ if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.trace(str);}
}void poco_log::critical(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.critical(str);}
}void poco_log::information(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.information(str);}
}void poco_log::notice(std::string str)
{if (!str.empty()){//m_logger.setChannel(m_formattingChannel);m_logger.notice(str);}
}void init_logger(const std::string app_name,const std::string app_version,bool use_console_log,bool file_log,const std::string target,std::string loglevel,int64_t rotation_size,bool auto_flush)
{g_logger &#61; {app_name,app_version,use_console_log,file_log,target,loglevel,rotation_size,auto_flush};defaltName &#61; app_name;
}void LOGE(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj){if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->error(logs);} elselogObj->error(logs);
}void LOGE_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGE(std::string(printf_buf));
}void LOGE_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGE(std::string(printf_buf),type);
}void LOGD(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->debug(logs);}elselogObj->debug(logs);
}void LOGD_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGD(std::string(printf_buf));
}void LOGD_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGD(std::string(printf_buf),type);
}void LOGW(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->warning(logs);}elselogObj->warning(logs);
}void LOGW_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGW(std::string(printf_buf));
}void LOGW_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGW(std::string(printf_buf),type);
}void LOGC(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->critical(logs);}elselogObj->critical(logs);
}void LOGC_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGC(std::string(printf_buf));
}void LOGC_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGC(std::string(printf_buf),type);
}void LOGF(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->fatal(logs);}elselogObj->fatal(logs);
}void LOGF_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGF(std::string(printf_buf));
}void LOGF_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGF(std::string(printf_buf),type);
}void LOGI(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->information(logs);}elselogObj->information(logs);
}void LOGI_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGI(std::string(printf_buf));
}void LOGI_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGI(std::string(printf_buf),type);
}void LOGN(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->notice(logs);}elselogObj->notice(logs);
}void LOGN_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGN(std::string(printf_buf));
}void LOGN_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGN(std::string(printf_buf),type);
}void LOGT(std::string logs,std::string type)
{if (!LOGVALID)return;std::string logname &#61; (type.empty() ? defaltName : type);poco_log *logObj &#61; GetLogObj(logname);if (0 &#61;&#61; logObj) {if (0 &#61;&#61; (logObj &#61; CreateLogObj(logname)))return;elselogObj->trace(logs);}elselogObj->trace(logs);
}void LOGT_Fmt(const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGT(std::string(printf_buf));
}void LOGT_Fmt_Type(std::string type,const char *fmt, ...)
{if (!LOGVALID)return;//定义接收输出信息最大长度1024字节char printf_buf[1024];//记录fmt对应的地址va_list args;//得到首个%对应的字符地址va_start(args, fmt);int printed &#61; vsprintf(printf_buf, fmt, args);va_end(args);LOGT(std::string(printf_buf),type);
}//获取日志对象
poco_log *GetLogObj(std::string type)
{auto it &#61; Llogs.find(type); if (Llogs.end() !&#61; it)return it->second;return 0;
}//创建日志类型
poco_log *CreateLogObj(std::string type)
{poco_log *logObj &#61; new poco_log;LoggerInfo logger &#61; g_logger;logger.app_name &#61; type;logObj->init(logger);Llogs[type] &#61; logObj;return logObj;
}//释放所有日志对象
void FreeLogObjs()
{for(auto it &#61; Llogs.begin();it !&#61; Llogs.end();it&#43;&#43;){if (it->second)delete it->second,it->second &#61; 0;}
}



  Poco日志用法&#xff1a;

init_logger("test","1.0.0",1(日志输出到控制台),1(保存日志到文件),"/tmp",0);
LOGI_Fmt("load ini ... :%s \n","test.ini");


  Poco智能指针用法&#xff1a;

Poco::AutoPtr taskalloc &#61; new Taskalloc();
taskalloc->func();



  Poco json相关用法&#xff1a;


    解析json&#xff1a;

//获取json数据Parser parser;Var result &#61; parser.parse(msg);//转换为可以解析key的jsonPoco::JSON::Object::Ptr object &#61; result.extract();Var test &#61; object->get("test");//{"test" : { "property" : "value" } }Poco::JSON::Object::Ptr subObject &#61; test.extract();test &#61; subObject->get("property"); // { "property" : "value" }std::string val &#61; test.toString();


    转换为json格式的数据&#xff1a;

JSON::Object json;json.set("test", "123");std::stringstream out;Poco::JSON::Object::Ptr Object &#61; json.extract();Object->stringify(json,out);std::string str;str &#61; out.str()



  Poco 获取当前时间&#xff1a;

char StrFormat[256] &#61; {0};
Poco::LocalDateTime local;
local.utcTime();
sprintf(StrFormat,"02d%02d%02d%02d%02d",local.year(),local.month(),local.day(),local.hour(),local.minute(),local.second());



  Poco 线程池用法&#xff1a;

class Task : public Poco::Runnable{virtual void run(){}virtual void release(){}};Poco::ThreadPool m_workthrdpool;
//初始化线程数量
m_workthrdpool.addCapacity(8);
//线程池调用
if (0 {Task *task &#61; new Task();m_workthrdpool.start(*task);
}



  Poco 互斥锁用法&#xff1a;

//互斥锁
Poco::Mutex m_mutex;
m_mutex.lock();
m_mutex.unlock();



  Poco 智能锁&#xff1a;

class Lock : public Poco::Runnable
{
public:Lock( Poco::Mutex& mtx ):m_mtx(mtx){}void run( ){//获取锁Poco::Mutex::ScopedLock s( m_mtx);}private:Poco::Mutex& m_mtx;
};



  Poco 智能锁用法&#xff1a;

//互斥锁
Poco::Mutex m_mutex;
void test()
{Lock lock(m_mutex);lock.run();
}



  PocoUtil&#xff1a;



    PocoUtil属于命令行程序及后台程序相关框架&#xff0c;集成功能有&#xff1a;
      命令行参数调用、后台程序启动等&#xff0c;这个框架提供了对于Unix守护进行的支持。



    PocoUtil常用头定义&#xff1a;

      #include “Poco/Util/Application.h”
      #include “Poco/Util/ServerApplication.h”
      #include “Poco/Util/Option.h”
      #include “Poco/Util/OptionSet.h”
      #include “Poco/Util/HelpFormatter.h”
      #include “Poco/Util/IntValidator.h”
      #include “Poco/Util/RegExpValidator.h”
      #include “Poco/Util/Subsystem.h”



    使用PocoUtil框架需要包含库名&#xff1a;

      PocoFoundation
      PocoUtil




  Poco 控制台程序&#xff1a;


    .h文件

using namespace Poco;class LPoco_Cli : public Util::Application
{
public:void initialize( Application& self );void uninitialize( );void defineOptions( Util::OptionSet& options);//void handleHelp(const std::string& name, const std::string& value);//versionvoid handleVersion(const std::string& name, const std::string& value);
}


    .cpp文件

//程序名称
const char *__progname &#61; "test";
void LPoco_Cli::initialize( Application& self )
{Util::Application::initialize( self );
}void LPoco_Cli::uninitialize( )
{Util::Application::uninitialize( );
}void LPoco_Cli::defineOptions( Util::OptionSet& options)
{Util::Application::defineOptions( options );//必须调用m_options &#61; options;options.addOption(Util::Option("help", "h","show the help messages").required(false).repeatable(false).callback(Util::OptionCallback (this, &LPoco_Cli::handleHelp)));options.addOption(Util::Option("version", "v","show version").required(false).repeatable(false).callback(Util::OptionCallback (this, &LPoco_Cli::handleVersion)));
}void LPoco_Cli::handleHelp(const std::string& name, const std::string& value )
{std::cout <<__progname <<" Global command help:" <}void LPoco_Cli::handleVersion(const std::string& name, const std::string& value )
{std::cout <<__progname <<" version :" <}int LPoco_Cli::main(const std::vector& args)
{std::function termination_callback;Poco_Srv *app &#61; new Poco_Srv();termination_callback &#61; std::bind(&Poco_Srv::Run, app);return 0;
}


  Poco 控制台程序启动方式&#xff1a;


    在main函数中&#xff1a;

try{LPoco_Cli app;app.init( argc, argv );//在这里传主函数参数。app.run( );}catch( Poco::Exception &e ){std::cerr <<"error: " <

推荐阅读
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • Android中解析XML文件的实践指南
    本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。 ... [详细]
  • 本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ... [详细]
  • 随着毕业设计的结束,我终于有时间更新我的博客了。这次,我将分享如何在自己的服务器上搭建 Bitwarden,一个广受好评的开源密码管理工具。 ... [详细]
  • 本文介绍了如何在Ubuntu 16.04系统上配置Nginx服务器,以便能够通过网络访问存储在服务器上的图片资源。这解决了在网页开发中需要使用自定义在线图标的需求。 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 本文详细介绍了C++中map容器的多种删除和交换操作,包括clear、erase、swap、extract和merge方法,并提供了完整的代码示例。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • HTTPS与TLS/SSL协议详解:握手及记录协议
    HTTPS,即HTTP over TLS/SSL,通过在HTTP通信层引入安全协议,确保数据传输的安全性。本文将深入探讨TLS/SSL协议的基本概念、HTTPS的必要性,以及TLS握手和记录协议的工作原理。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
author-avatar
鐘彦璋864175
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有