我是一个boost用作c ++库的项目的一部分.现在我们要使用SMTP/POP3/SSL/HTTP/HTTPS.我在中检测到了几个拟合类和函数Poco::Net
我找不到任何相同的东西boost::asio.在我做出最终决定之前,我想询问社区,如果我是对的,或者是否有类似的东西boost......
我有一个UDPlistener应用程序,我需要编写单元测试.此侦听器持续侦听端口,并且始终在产品上运行.我们将poco库用于不在标准库中的框架.
现在我需要将它添加到单元测试应用程序中.
我认为Poco::Runnable在RunApp运行应用程序的类中实现它是最容易的.然后我可以Poco::Thread在我的单元测试中创建一个新的来运行RunApp该类.
这有效; 我的监听器正在运行,我可以在生成线程后在单元测试体中发送测试消息.但是,我需要停止监听器,以便其他单元测试可以运行.我添加了一条UDP消息,告诉监听器自杀,但这仅用于单元测试和潜在的安全问题.
有没有办法强制Poco::Thread停止?或者我构建这个单元测试错了?我不希望监听器在所有其他单元测试期间运行.
你建议我使用哪个图书馆?我不知道这些库中的任何一个.我听说,经常使用Boost,但也难以编码.
所以尽可能使这个问题成为客观:只是从初学者程序员的角度来看(我在生活中用C++编写了~1000 LOC)哪个库会更好学习?
我将主要用于HTTP客户端.
我正在尝试使用POCO制作带有HTTP基本身份验证的HTTP帖子(明文用户名和密码).我找到了一个Get的例子,并尝试修改它,但作为一个新手,我想我已经把它毁了它的用处.有人知道怎么做吗?
是的,我已经看到了另一个问题:POCO C++ - NET SSL - 如何发布HTTPS请求,但我无法理解它是如何尝试实现用户名和密码部分的.我也不明白"x-www-form-urlencoded"的用法.邮政需要这个吗?我没有表格.只想用用户名和密码参数POST到服务器.
我使用POCO C++ Net库作为http
我想尝试为持久缓存制定策略.
首先,我想我需要从缓存标题中过期并使用缓存值进行交叉检查(请告诉我,如果我错了).
那么如何从中提取缓存头httpResponse?
我已经看到你可以用Java(getFirstHeader())执行此操作,但是如何在POCO C++中执行此操作?
以下是使用POCO的普通http GET请求:
try
{
// prepare session
URI uri("http://www.google.se");
HTTPClientSession session(uri.getHost(), uri.getPort());
// prepare path
string path(uri.getPathAndQuery());
if (path.empty()) path = "/";
// send request
printnet(path.c_str());
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
session.sendRequest(req);
// get response
printnet("Get response");
HTTPResponse res;
cout << res.getStatus() << " " << res.getReason() << endl;
// print response
istream &is = session.receiveResponse(res);
StreamCopier::copyStream(is, cout);
}
catch (Exception &ex)
{
printnet(ex.displayText().c_str());
return -1;
}
return 0;
Run Code Online (Sandbox Code Playgroud) 我一直在尝试在我的编程项目中使用Poco库,但我得到链接错误.我的C++文件在main函数中只有一行代码,应该可以正常编译.
我的C++文件:
/**
* Created by kkprince on 27/06/16.
*/
#include <Poco/AutoPtr.h>
#include <Poco/Util/IniFileConfiguration.h>
using Poco::AutoPtr;
using Poco::Util::IniFileConfiguration;
int main(int argc, char* argv[]){
AutoPtr<IniFileConfiguration> pConf(new IniFileConfiguration("invalid"));
}
Run Code Online (Sandbox Code Playgroud)
我的CMakeLists:
cmake_minimum_required(VERSION 3.5)
project(village.io-server CXX)
include(conanbuildinfo.cmake)
conan_basic_setup()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/home/kkprince/ClionProjects/village.io/build")
set(CMAKE_BINARY_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
find_package(Boost
COMPONENTS program_options system REQUIRED)
set(SOURCE_FILES main.cpp) # src/Runner.cpp src/Runner.h src/workQueue/workQueue.h src/server/Server.cpp src/server/Server.h)
add_executable(village.io-server ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(village.io-server ${Boost_LIBRARIES} ${CONAN_LIBS})
Run Code Online (Sandbox Code Playgroud)
还有我的conanfile.txt:
[requires]
Poco/1.7.3@lasote/stable
easyloggingpp/9.80@memsharded/testing
[options]
Poco:shared=False
[generators]
cmake
Run Code Online (Sandbox Code Playgroud)
我生成的conaninfo.txt:
[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.libcxx=libstdc++
compiler.version=5.3
os=Linux
[requires]
Poco/1.Y.Z
easyloggingpp/9.Y.Z
[options]
[full_settings]
arch=x86_64 …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试在我的 C++ 应用程序中使用事务,但我对 ODBC 的自动提交模式有问题。
我正在使用 POCO 库在同一台机器上创建到 PostgreSQL 数据库的连接。目前,我可以将数据作为单个语句发送到这个数据库,但我无法理解如何使用 Poco 的事务库来更快地发送这些数据。
因为我有几千条记录要插入,所以继续使用单个插入语句非常慢且不切实际 - 所以我试图使用 Poco 的事务来加快速度(相当一点)。
我遇到的错误理论上是一个简单的错误 - Poco 抛出以下错误:
'Invalid access: Session is in auto commit mode.'
Run Code Online (Sandbox Code Playgroud)
我明白,因此,我应该以某种方式将“自动提交”设置为 false - 因为它只允许我将数据逐行提交到数据库,而不是作为单个事务提交。
问题是我如何设置它。
目前,我有一个从 Session.h 创建的会话,它看起来很像这样:
session = new Poco::Data::Session(
"ODBC",
connection_data.str()
);
Run Code Online (Sandbox Code Playgroud)
其中连接数据是一个简单的字符串流,包含登录信息、密码、数据库、服务器和“Driver={PostgreSQL ANSI};” 告诉 ODBC 使用 PostgreSQL 的驱动程序。
我曾尝试通过会话的 setFeature 或 setProperty 设置将属性“自动提交”设置为 false,当然,这无济于事。(此时更像是一次尝试)。
session->setFeature("AUTOCOMMIT", false);
Run Code Online (Sandbox Code Playgroud)
环顾四周,我看到了一种可能的替代方法,即直接从 ODBC/session/SessionImpl.h 创建一个 ODBC sessionImpl 而不是使用上面的这个通用方法,然后从中创建一个新的会话对象。
这样做的好处是 ODBC 的 sessionImpl 在标头中引用了自动提交模式,这表明它能够处理这个问题:
void autoCommit(const std::string&, bool val);
/// Sets autocommit property for …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用POCO 1.7.5设置websocket服务器.
这里发现的POCO样本效果很好.111-122行读取(sligthly prettified):
WebSocket ws(request, response);
char buffer[1024];
int n, flags;
do
{
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
ws.sendFrame(buffer, n, flags);
}
while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
Run Code Online (Sandbox Code Playgroud)
但是,这种方法不需要通过乒乓帧来回答ping帧.如何使用POCO正确完成此操作?我试过以下,但我不知道它是否正确:
WebSocket ws(request, response);
char buffer[1024];
int n, flags;
do
{
n = ws.receiveFrame(buffer, sizeof(buffer), flags);
if ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_PING){
buffer[0] = WebSocket::FRAME_OP_PING;
ws.sendFrame(buffer, 1, WebSocket::FRAME_OP_PONG);
}
else{
ws.sendFrame(buffer, n, flags);
}
}
while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
Run Code Online (Sandbox Code Playgroud)
不知道这是否是正确的做法,并且无法在线找到,包括POCO文档.该 …
我看过一些如何迭代思想嵌套对象的示例JSON,例如:
"{ \"test\" : { \"property\" : \"value\" } }"
Run Code Online (Sandbox Code Playgroud)
但现在我需要迭代一个JSON数组(下面的子数组 array):
"{ \"name\" : \"Franky\", \"children\" : [ \"Jonas\", \"Ellen\" ] }"
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这个目标?
我在任何地方都看不到示例,甚至在POCO文档中都看不到。
我有下面的示例,但无法获取Children数组。
Poco::Dynamic::Var test = object->get("children");
Poco::JSON::Array::Ptr subObject = test.extract<Poco::JSON::Array::Ptr>();
for (it = subObject->begin(); it != subObject->end(); it++) // how to iterate here?
{
std::cout << "my children:" << it->first << "\n";
}
Run Code Online (Sandbox Code Playgroud) 我JSON使用这样的POCO库生成一个文件:
void writeToFile()
{
Poco::JSON::Object::Ptr json = new Poco::JSON::Object;
json->set("name", "foo");
json->set("address", "bar");
std::ostringstream oss;
Poco::JSON::Stringifier::stringify(json, oss);
std::ofstream ofs("output.json");
if (ofs.is_open() == true)
{
ofs << oss.str();
ofs.close();
}
}
Run Code Online (Sandbox Code Playgroud)
其中output.json包含:
{"name":"foo","address":"bar"}
Run Code Online (Sandbox Code Playgroud)
有什么办法POCO可以美化一个JSON?
所以输出会是这样的:
{
"name" : "foo",
"address" : "bar"
}
Run Code Online (Sandbox Code Playgroud) poco-libraries ×10
c++ ×8
http ×2
arrays ×1
boost ×1
boost-asio ×1
cmake ×1
conan ×1
http-caching ×1
json ×1
odbc ×1
passwords ×1
post ×1
postgresql ×1
sql ×1
unit-testing ×1
websocket ×1