POCO C++ Libraies介绍及常见用法

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

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

官方网址:POCO官方

官方文档: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 = srv.acceptConnection();
	Poco::Net::SocketStream str(ss);
	str << "HTTP/1.0 200 OK\r\n"
	 "Content-Type: text/html\r\n"
	 "\r\n"
	 "<html><head><title>Server..</title></head>"
	 "<body><h1>Hello world</h1></body></html>"
	 << std::flush;
	 usleep(1);
}
HTTP(UDP)服务器启动方式:
Poco::Net::SocketAddress socketAddress("www.test.com",8080);
Poco::Net::DatagramSocket datagram(socketAddress);  

char buffer[1024];
for ( ; ; )
  {
	Poco::Net::SocketAddress sender;
	int n = datagram.receiveFrom(buffer, sizeof(buffer) - 1, sender);
	buffer[n] = '\0';
	std::cout << sender.toString() << ": " << buffer << std::endl;
	usleep(1);
  }
HTTP客户端编写方式:

.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 ostr
		void LCopyStream(Poco::Net::StreamSocket stream,std::string format,std::ostream & ostr, std::size_t bufferSize = 8192);

		//拷贝流数据 使用内部缓冲区将从istr读取的所有字节写入string ostr
		std::string LCopyString(Poco::Net::StreamSocket stream,std::string format,std::string & ostr, std::size_t bufferSize = 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 << format;
	Socket.flush();
	Poco::StreamCopier::copyStream(Socket, /*std::cout*/ostr,bufferSize);
}


//拷贝流数据 使用内部缓冲区将从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 << format;
	Socket.flush();
	Poco::StreamCopier::copyToString(Socket,ostr,bufferSize);
	return ostr;
}

方法调用:

LPoco m_poco;
	Poco::Net::SocketAddress stream = m_poco.LCtSocketToServer("www.test.com", 8080);
	Poco::Net::StreamSocket socket = 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 << ostr << std::endl;
DNS域名解析方式:
const HostEntry& entry = DNS::hostByName("www.appinf.com");
//获取别名
const HostEntry::AliasList& aliases = entry.aliases();
HostEntry::AliasList::const_iterator it = aliases.begin();
int nNum = 0;
for (; it != aliases.end(); ++it)
{
	std::cout << "Alias: " << *it << "" << ++nNum << std::endl;
}
//获取地址
nNum = 0;
const HostEntry::AddressList& addrs = entry.addresses();
HostEntry::AddressList::const_iterator it1 = addrs.begin();
for (; it1 != addrs.end(); ++it1)
{
	std::cout << "Address: " << it1->toString() << " " << nNum++ << std::endl;
}

PocoFoundation:

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

PocoFoundation常用头定义:
#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框架需要包含库名:
PocoFoundation

Poco日志(封装后的函数):

.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 <iostream>
#include <string>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <map>
#include<ctype.h>
#include<string.h>
#include <cstdarg>

#define PATH			"/works/examples"
#define NAME			"poco_log"
#define SUFFIX			".log"

//日志是否有效写入,如果为false直接返回
#define LOGVALID		true


void init_logger(const std::string app_name,
		    const std::string app_version,
		    bool use_console_log = true,
		    bool file_log = true,
		    const std::string target = "./log",
			std::string loglevel = "information",
		    int64_t rotation_size = 10 * 1024 * 1024,
		    bool auto_flush = 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();
		//传入日志路径和名称,其中日志路径可以为空
		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 = Poco::Logger::root();
		Poco::AutoPtr<Poco::/*SimpleFileChannel*/Channel> m_Channel;
		Poco::AutoPtr<Poco::PatternFormatter> m_patternFormatter;
		Poco::AutoPtr<Poco::FormattingChannel> m_formattingChannel;
		LoggerInfo m_logInfo;
};

static LoggerInfo g_logger;


void LOGE(std::string logs,std::string type = "");
void LOGE_Fmt(const char *fmt, ...);
void LOGE_Fmt_Type(std::string type,const char *fmt, ...);
void LOGD(std::string logs,std::string type = "");
void LOGD_Fmt(const char *fmt, ...);
void LOGD_Fmt_Type(std::string type,const char *fmt, ...);
void LOGW(std::string logs,std::string type = "");
void LOGW_Fmt(const char *fmt, ...);
void LOGW_Fmt_Type(std::string type,const char *fmt, ...);
void LOGC(std::string logs,std::string type = "");
void LOGC_Fmt(const char *fmt, ...);
void LOGC_Fmt_Type(std::string type,const char *fmt, ...);
void LOGF(std::string logs,std::string type = "");
void LOGF_Fmt(const char *fmt, ...);
void LOGF_Fmt_Type(std::string type,const char *fmt, ...);
void LOGI(std::string logs,std::string type = "");
void LOGI_Fmt(const char *fmt, ...);
void LOGI_Fmt_Type(std::string type,const char *fmt, ...);
void LOGN(std::string logs,std::string type = "");
void LOGN_Fmt(const char *fmt, ...);
void LOGN_Fmt_Type(std::string type,const char *fmt, ...);
void LOGT(std::string logs,std::string type = "");
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 = false;
static std::string defaltName;
std::map<std::string,poco_log*> Llogs;

poco_log::poco_log()
{
	
}

poco_log::poco_log(LoggerInfo log):m_logInfo(log)
{
	
}

void poco_log::init(LoggerInfo log)
{
	m_logInfo = log;
	if (log.use_console_log)
		m_Channel = new Poco::ConsoleChannel;
	else
	{
		m_Channel = new Poco::SimpleFileChannel;
		char StrFormat[256] = {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 = new Poco::PatternFormatter("[%Y-%n-%e %H:%M:%S] [%U(%u)] %p: %t");
	m_patternFormatter = new Poco::PatternFormatter("[%Y-%n-%e %H:%M:%S] [%p]: %t");
	m_patternFormatter->setProperty("times", "local");  // 格式化中的时间显示为本地时间
	m_formattingChannel = new Poco::FormattingChannel(m_patternFormatter, m_Channel);
	m_logger.setLevel(log.loglevel);
	m_logger.setChannel(m_formattingChannel);
	g_bValid = 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 = {app_name,app_version,use_console_log,file_log,
		target,loglevel,rotation_size,auto_flush};
	defaltName = app_name;
}

void LOGE(std::string logs,std::string type)
{
	if (!LOGVALID)
		return;
	std::string logname = (type.empty() ? defaltName : type);
	poco_log *logObj = GetLogObj(logname);
	if (0 == logObj){
		if (0 == (logObj = CreateLogObj(logname)))
			return;
		else
			logObj->error(logs);
	}	
	else
			logObj->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 = 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 = 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 = (type.empty() ? defaltName : type);
	poco_log *logObj = GetLogObj(logname);
	if (0 == logObj) {
		if (0 == (logObj = CreateLogObj(logname)))
			return;
		else
			logObj->debug(logs);
	}
	else
			logObj->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 = 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 = 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 = (type.empty() ? defaltName : type);
	poco_log *logObj = GetLogObj(logname);
	if (0 == logObj) {
		if (0 == (logObj = CreateLogObj(logname)))
			return;
		else
			logObj->warning(logs);
	}
	else
			logObj->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 = 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 = 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 = (type.empty() ? defaltName : type);
	poco_log *logObj = GetLogObj(logname);
	if (0 == logObj) {
		if (0 == (logObj = CreateLogObj(logname)))
			return;
		else
			logObj->critical(logs);
	}
	else
			logObj->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 = 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 = 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 = (type.empty() ? defaltName : type);
	poco_log *logObj = GetLogObj(logname);
	if (0 == logObj) {
		if (0 == (logObj = CreateLogObj(logname)))
			return;
		else
			logObj->fatal(logs);
	}
	else
			logObj->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 = 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 = 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 = (type.empty() ? defaltName : type);
	poco_log *logObj = GetLogObj(logname);
	if (0 == logObj) {
		if (0 == (logObj = CreateLogObj(logname)))
			return;
		else
			logObj->information(logs);
	}
	else
			logObj->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 = 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 = 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 = (type.empty() ? defaltName : type);
	poco_log *logObj = GetLogObj(logname);
	if (0 == logObj) {
		if (0 == (logObj = CreateLogObj(logname)))
			return;
		else
			logObj->notice(logs);
	}
	else
			logObj->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 = 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 = 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 = (type.empty() ? defaltName : type);
	poco_log *logObj = GetLogObj(logname);
	if (0 == logObj) {
		if (0 == (logObj = CreateLogObj(logname)))
			return;
		else
			logObj->trace(logs);
	}
	else
			logObj->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 = 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 = vsprintf(printf_buf, fmt, args);
    va_end(args);

	LOGT(std::string(printf_buf),type);
}

//获取日志对象
poco_log *GetLogObj(std::string type)
{
	auto it = Llogs.find(type); 
	if (Llogs.end() != it)
		return it->second;
	return 0;
}

//创建日志类型
poco_log *CreateLogObj(std::string type)
{
	poco_log *logObj = new poco_log;
	LoggerInfo logger = g_logger;
	logger.app_name = type;
	logObj->init(logger);
	Llogs[type] = logObj;
	return logObj;
}

//释放所有日志对象
void FreeLogObjs()
{
	for(auto it = Llogs.begin();it != Llogs.end();it++)
	{
		if (it->second)
			delete it->second,it->second = 0;
	}
}
Poco日志用法:
init_logger("test","1.0.0",1(日志输出到控制台),1(保存日志到文件),"/tmp",0);
LOGI_Fmt("load ini ... :%s \n","test.ini");
Poco智能指针用法:
Poco::AutoPtr<Taskalloc> taskalloc = new Taskalloc();
taskalloc->func();
Poco json相关用法:

解析json

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

转换为json格式的数据

	JSON::Object json;
	json.set("test", "123");
	std::stringstream out;
	Poco::JSON::Object::Ptr Object = json.extract<Poco::JSON::Object::Ptr>();
	Object->stringify(json,out);
	std::string str;
	str = out.str()
Poco 获取当前时间:
char StrFormat[256] = {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 线程池用法:
 class Task : public Poco::Runnable
 {
 	virtual void run()
	{
	}

	virtual void release()
	{
	}
 };

Poco::ThreadPool m_workthrdpool;
//初始化线程数量
m_workthrdpool.addCapacity(8);
//线程池调用
if (0 < m_workthrdpool.available())
{
	Task *task = new Task();
	m_workthrdpool.start(*task);
}
Poco 互斥锁用法:
//互斥锁
Poco::Mutex m_mutex;
m_mutex.lock();
m_mutex.unlock();
Poco 智能锁:
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 智能锁用法:
//互斥锁
Poco::Mutex m_mutex;
void test()
{
	Lock lock(m_mutex);
    lock.run();
}

PocoUtil:

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

PocoUtil常用头定义:
#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框架需要包含库名:
PocoFoundation
PocoUtil

Poco 控制台程序:

.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);
	//version
	void handleVersion(const std::string& name, const std::string& value);
}

.cpp文件

//程序名称
const char *__progname = "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 = options;

	options.addOption(
	    Util::Option("help", "h",
		    "show the help messages")
		    .required(false)
		    .repeatable(false)
		    .callback(Util::OptionCallback < LPoco_Cli >(this, &LPoco_Cli::handleHelp)));
	
	options.addOption(
	    Util::Option("version", "v",
		    "show version")
		    .required(false)
		    .repeatable(false)
		    .callback(Util::OptionCallback < LPoco_Cli >(this, &LPoco_Cli::handleVersion)));
}

void LPoco_Cli::handleHelp(const std::string& name, const std::string& value )
{
	std::cout << __progname << " Global command help:" << std::endl;
	std::cout << "handleHelp : name " << name << std::endl;
   	std::cout << "handleHelp : value " << value << std::endl;

	Poco::Util::HelpFormatter helpFormatter(options());
	helpFormatter.format(std::cout);
}

void LPoco_Cli::handleVersion(const std::string& name, const std::string& value )
{
	std::cout << __progname << " version :" << std::endl;
	std::cout << "    version    :"<< "1.0.0" << std::endl;
}

int LPoco_Cli::main(const std::vector<std::string>& args)
{
	std::function< void() > termination_callback;
	Poco_Srv *app =  new Poco_Srv();
	termination_callback = std::bind(&Poco_Srv::Run, app);
	return 0;
}
Poco 控制台程序启动方式:

在main函数中:

try
    {
        LPoco_Cli app;
        app.init( argc, argv );//在这里传主函数参数。
        app.run( );
    }catch( Poco::Exception &e )
    {
        std::cerr << "error:  " << e.what() << std::endl;
    }
发布了87 篇原创文章 · 获赞 195 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/a29562268/article/details/101636307