如何使用cpp-netlib实现HTTPS服务器?
以下问题使我无法合并asio SSL和cpp-netlib:
通过asio和cpp-netlib的SSL都使用asio接受器来监听端口(例如80或443),然后使用单独的会话进行实际连接.
我认为对于HTTPS:
但是如何将cpp-netlib的HTTP连接处理程序与接受器分开使用呢?
或者是否从asio SSL连接传递了io_service?如果是这样,哪一个?或者它们都是一样的?
或者是否有完全不同的路线?
我正在使用cpp-netlib在异步模式下使用C++在Ubuntu 14.04上开发Web服务.该服务需要响应消息正文中通过HTTP POST发送的数据.当接收大于1K的输入时,我观察到性能不佳,我想解决这个问题.
如果数据相对较小,小于1K,则服务器几乎立即接收数据.如果数据大于1K,则在将第一个实际数据块呈现给回调之前首次调用异步读回调函数后,大约会有一秒钟的延迟.在最初的延迟之后,随后的块几乎立即到达.
我怎样才能消除这种延迟?是使用curl发布测试数据的工件吗?如何轻松测试curl发布数据的性能?
你可以找到在github上演示问题的最小源代码.这是我用来将数据发布到服务器的命令:
rcook$ curl -d @AsyncDaemon.h http://localhost:8787/foo
Run Code Online (Sandbox Code Playgroud)
以下是其输出示例(带注释):
rcook$ ./async_daemon
1431387368.321863: AsyncDaemon constructor
1431387368.322446: receive thread beginning
*** It's waiting for a connection here.
1431387371.536191: begin transaction 0 on thread 24050
1431387371.536237: transaction 0 constructor
1431387371.536273: received 1206 byte request for /foo from 127.0.0.1:49402
1431387371.536312: invoked asynchronous read
1431387371.536321: end transaction handler
1431387371.536335: begin asynchronous read callback on thread 24050
1431387371.536348: read 0 bytes
1431387371.536386: invoked asynchronous read
1431387371.536394: end asynchronous read callback
*** …Run Code Online (Sandbox Code Playgroud) 我想将Library cpp-netlib用于C++项目.因此我在自制软件的帮助下安装了boost库(操作系统是Mac OS X 10.8).然后我从项目主页下载了cpp-netlib,使用cmake为g ++创建了Makefile并成功应用了make."make test"通过了所有测试.然后我将cpp-netlib的include文件夹复制到boost目录中.
所以这就是麻烦开始的时候:我试图编译文档的第一个示例http-client,但无法使其工作.我用的时候
g++ test.cpp -o out -I/usr/local/Cellar/boost/1.53.0/include
-L/usr/local/Cellar/boost/1.53.0/lib
-lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt
Run Code Online (Sandbox Code Playgroud)
我收到了这些链接器错误:
Undefined symbols for architecture x86_64:
"boost::network::uri::detail::parse(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::network::uri::detail::uri_parts<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)", referenced from:
boost::network::uri::uri::parse() in ccs87Dq3.o
"boost::network::http::impl::normal_delegate::normal_delegate(boost::asio::io_service&)", referenced from:
boost::network::http::impl::connection_delegate_factory<boost::network::http::tags::http_async_8bit_udp_resolve>::new_connection_delegate(boost::asio::io_service&, bool, boost::optional<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::optional<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)in ccs87Dq3.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit …Run Code Online (Sandbox Code Playgroud) 我想在我的Windows上运行的C++项目中使用cpp-netlib库.我严格遵循http://cpp-netlib.github.com/getting_started.html下的说明直到"获取CMake"部分,这是我停止理解指令的地方.CMake确实是非强制性的吗?如果是这样,所需的确切步骤是什么,以便我可以在我的项目中使用该库?
如果有人可以在这里向我提供说明,或者请参考详细指南,那就太棒了.谷歌并没有那么帮助我.
是否会在Solaris上构建完整的Boost?
我想知道是否有人在此之前取得了成功(特别是原型/精神版),然后再支付修补Sun Studio 12.2到最新版本的支持合同.我得到了一些错误,有些看起来已经在修补程序中得到了解决,但是向Oracle支付费用并不便宜,所以我宁愿希望它能在我做之前完成.
现在,我只是尝试在Solaris上使用cpp-netlib并使用Boost属性树解码一些通过HTTP获取的JSON.它在Mac OS X上运行良好 - 所以我希望我可以在Solaris上使用相同的代码.
我正在尝试使用cmake编译cpp-netlib.
我的配置:OS X 10.9.1 Mavericks + Xcode 5.0.2 cpp-netlib 0.11.0 cmake 2.8.12.2 Boost 1.55.0
因为我试图让整个事情与OS X和iOS 7一起工作,所以我使用以下脚本创建了一个Boost框架:https: //github.com/mgrebenets/boost-xcode5-iosx
我做了一个没有c ++ 11的干净安装,例如:"$ ./boost.sh clean -v 1.55.0"
这产生了两个"boost.framework"目录,一个用于OS X,第二个用于iOS.我已经在"Build Phases> Link Binary With Libraries"中成功地将OS X Boost框架添加到我的Xcode项目中,并测试了Boost文档中的boost :: regex示例,该文档在我的Mac上运行良好.
但是,当我开始制作cpp-netlib时,我遇到了问题.当我尝试运行时:
$ cmake -DCMAKE_BUILD_TYPE = Debug -DCMAKE_C_COMPILER = gcc -DCMAKE_CXX_COMPILER = g ++ ../cpp-netlib-0.11.0-final/
它产生以下输出:
-- The C compiler identification is Clang 5.0.0
-- The CXX compiler identification is Clang 5.0.0
-- Check for working C compiler: /usr/bin/gcc
-- Check for working …Run Code Online (Sandbox Code Playgroud) 我正在使用它boost::network::uri::encoded()来编码我的请求 URL。
但是当我构建项目时,我看到了错误:
error C2039: "value": Is not a member of "boost::proto"
Run Code Online (Sandbox Code Playgroud)
其中有四个,他们的报道来自:
boost\proto\generate.hpp(239,20);
boost\proto\generate.hpp(239,53);
boost\proto\generate.hpp(248,20);
boost\proto\generate.hpp(248,53)
Run Code Online (Sandbox Code Playgroud)
这是我的测试代码:
#include <iostream>
#include <string>
#include "boost/network/uri.hpp"
using std::string;
string EncodeURL(string str)
{
return boost::network::uri::encoded(str);
}
string DecodeURL(string str)
{
return boost::network::uri::decoded(str);
}
int main()
{
EncodeURL("https://test.com/a+a+a.html");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我安装boost并cpp-netlib使用了vcpkg。我的IDE是Visual Studio Professional 2019,操作系统是Windows 10 Professional Workstation x64(Ver.2004)。
我想知道如何避免这些错误或使用其他方法对 UNICODE 兼容的 URL 进行编码。
我是cmake的新手(2.8.12.1),我在Windows上使用它生成项目文件,使用Visual Studio 2012构建cpp-netlib.
默认情况下,它使用/ MDd编译器开关进行编译.我想改变它,以便它使用/ MTd.
我按照这里给出的建议/sf/answers/992101001/但它不适合我.
具体来说,我在if语句中添加了下面显示的第二行到CmakeLists.txt.
if (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()
Run Code Online (Sandbox Code Playgroud)
当我打开Visual Studio sln文件时,我可以看到仍然设置了/ MDd选项.此外,我在CMakeCache.txt中看到以下内容:
//Flags used by the compiler during debug builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
Run Code Online (Sandbox Code Playgroud)
我也尝试过像这样设置标志:
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.
如果我通过命令行传递选项,如下所示:
-DCMAKE_CXX_FLAGS_DEBUG="/MTd"
Run Code Online (Sandbox Code Playgroud)
该选项已在Visual Studio项目中成功设置.
谁能告诉我我做错了什么?
如果有人可以告诉我缓存中的值来自于我未在命令行中指定或不在CmakeLists.txt中的位置,我也将不胜感激.
根据请求添加CMakeList.txt.如果我没有做到这一点,我从来没有发布过这样的道歉.
# Original from cpp-netlib.org with my edits
cmake_minimum_required(VERSION 2.8)
project(CPP-NETLIB)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTI_THREADED ON)
find_package( Boost 1.45.0 REQUIRED unit_test_framework system regex date_time thread filesystem program_options chrono )
find_package( OpenSSL )
find_package( Threads …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能为版本0.9.1的cpp-netlib中的windows(x86和x64)的静态库获取二进制文件?
坦率地说,在Windows上为我编译这个很痛苦.
谢谢
运行从[/ edit] HttpClient示例复制的Cpp-netlib(版本0.11-rc1)[编辑(添加)] 代码时,无法完成.
我认为是因为连接处于打开状态.1.我的假设是否正确?2.是否必须手动关闭连接?3.如果是,如何访问连接?
我最近开始学习 CMake 并决定将它用于我正在处理的一个旧项目。该项目有 cpp-netlib、boost 和 Openssl 作为依赖项。这是我想出的工作 CMakeLists.txt 文件。
CMAKE_MINIMUM_REQUIRED(VERSION 3.4.1)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
PROJECT(MangaMe)
INCLUDE_DIRECTORIES(includes)
ADD_EXECUTABLE(mangaMe src/mangaMe.cpp)
set(Boost_USE_MULTITHREADED ON)
FIND_PACKAGE(Boost 1.59.0 REQUIRED COMPONENTS system thread filesystem)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(mangaMe ${Boost_LIBRARIES})
SET(OPENSSL_LIB_DIR /usr/local/Cellar/openssl/1.0.2e/lib)
INCLUDE_DIRECTORIES(/usr/local/Cellar/openssl/1.0.2e/include)
TARGET_LINK_LIBRARIES(mangaMe ${OPENSSL_LIB_DIR}/libcrypto.dylib ${OPENSSL_LIB_DIR}/libssl.dylib)
#WHY DOESNT THIS WORK!?!??!!?
#FIND_PACKAGE(cppnetlib 0.11 REQUIRED COMPONENTS client-connections server-parsers uri)
#INCLUDE_DIRECTORIES(${cppnetlib_INCLUDE_DIRS})
#TARGET_LINK_LIBRARIES(mangaMe ${cppnetlib_LIBRARIES})
SET(CPPNETLIB_LIB_DIR /usr/local/Cellar/cpp-netlib/0.11.2/lib)
INCLUDE_DIRECTORIES(/usr/local/Cellar/cpp-netlib/0.11.2/include)
TARGET_LINK_LIBRARIES(mangaMe ${CPPNETLIB_LIB_DIR}/libcppnetlib-client-connections.a ${CPPNETLIB_LIB_DIR}/libcppnetlib-server-parsers.a ${CPPNETLIB_LIB_DIR}/libcppnetlib-uri.a)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人知道为什么使用 FIND_PACKAGE 来查找 cppnetlib 的注释掉部分不起作用?我使用自制软件来安装 cpp-netlib,当我运行 if(cppnetlib_FOUND) 时,我知道它找到了包,但似乎找不到库,所以当我尝试制作我的项目时,它错误地说它缺少 cpp 中的库-网络库。我还注意到,当我在 FIND_PACKAGE 中将版本设置为 0.11.2(当前安装的版本)时,我收到一条消息说
-- Boost version: 1.59.0
-- Found the following Boost libraries: …Run Code Online (Sandbox Code Playgroud) cpp-netlib ×11
c++ ×10
boost ×4
cmake ×2
boost-asio ×1
curl ×1
https ×1
ios ×1
linker ×1
macos ×1
performance ×1
solaris ×1
sunstudio ×1
vcpkg ×1