Articles of boost asio

ECDSA证书问题提升asio

我正在使用boost :: asio实现SSL服务器。 上下文初始化显示在下面的代码中 boost::asio::ssl::context_base::method SSL_version = static_cast<boost::asio::ssl::context_base::method>(param_values[ID_PROTOCOL_VERSION].int32_value); // load certificate files boost::shared_ptr<boost::asio::ssl::context> context_ = boost::shared_ptr<boost::asio::ssl::context>( new boost::asio::ssl::context(SSL_version)); p_ctx = boost::static_pointer_cast<void>(context_); context_->set_options(boost::asio::ssl::context::default_workarounds); context_->use_certificate_chain_file(cert_chain_file); context_->use_certificate_file(cert_file, boost::asio::ssl::context::pem); context_->use_private_key_file(cert_file, boost::asio::ssl::context::pem); context_->set_verify_mode(boost::asio::ssl::verify_peer | boost::asio::ssl::verify_fail_if_no_peer_cert); context_->set_verify_callback(boost::bind(&verify_certificate_cb, _1, _2)); if (param_values[ID_CIPHER_LIST].int32_value != 0) { std::string cipher_list = ""; generate_cipher_list(param_values[ID_CIPHER_LIST].int32_value, cipher_list); MA5G_logger::log(PRIORITY_INFO, "Supported cipher list %s", cipher_list.c_str()); SSL_CTX_set_cipher_list((reinterpret_cast<boost::asio::ssl::context*>(p_ctx.get()))->native_handle(), cipher_list.c_str()); } 在cipher_list ,我支持下面的列表 […]

如何提升Asio的主机名parsing在Linux上的工作? 是否可以使用NSS?

我试图使我的networking应用程序在本地工作(服务器和客户端在同一台计算机上运行),当没有networking连接时。 这似乎“偶尔工作”,但大部分时间我最终: terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' what(): Host not found (authoritative) Aborted 我目前使用的代码是: tcp::resolver::query query(host, PORT); tcp::resolver::iterator endpointIterator = resolver.resolve(query); tcp::resolver::iterator end; boost::system::error_code error = boost::asio::error::host_not_found; while(error && endpointIterator != end) { mySocket.close(); mySocket.connect(*endpointIterator++, error); } if(error) throw boost::system::system_error(error); 我敢肯定,我已经把问题缩小到ip :: basic_resolver :: resolve ,但我无法弄清楚如何在Linux上实现,或者我可能想要使用什么。 这似乎是同一个问题。 看来,只是不执行任何查找,只是使用127.0.0.1应该工作,但是当我试图取代查询行 tcp::resolver::query query(host, PORT, […]

在Linux中链接Boost库

我正在尝试使用Boost的Asio来构build一个项目,而且我遇到了一些麻烦。 最初,我试图build立没有任何额外的库的项目,因为一切都应该在头文件。 我正在尝试构build的程序如下所示: #include <iostream> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> int main() { boost::asio::io_service io; boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); t.wait(); std::cout << "Hello, world!" << std::endl; return 0; } 它可以在Boost的网站上find。 所以,最初我只是: -I /usr/include/boost_1_40_0 这导致了以下错误: make -k all Building target: HelloWorld Invoking: GCC C++ Linker g++ -o"HelloWorld" ./main.o ./main.o: In function `__static_initialization_and_destruction_0': /usr/include/boost_1_40_0/boost/system/error_code.hpp:205: undefined reference to `boost::system::get_system_category()' /usr/include/boost_1_40_0/boost/system/error_code.hpp:206: […]

exception运行boost asio ssl例子

我试图从boost :: asio运行SSL示例,我得到一个“无效的参数”exception,当我运行它们。 我在Linux x86_64上。 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/ssl/client.cpp http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/ssl/server.cpp 编译: g++ server.cpp -o server -lboost_system -lssl g++ client.cpp -o client -lboost_system -lssl 运行如下: $ ./server Usage: server <port> $ ./server 10000 Exception: Invalid argument $ ./server 1000 Exception: Permission denied $ sudo ./server 1000 Exception: Invalid argument 不知道是什么问题:(任何帮助将不胜感激。 谢谢!

监听传入数据时,“现有连接被远程主机强制closures”

在使用boost asio时,我偶然发现了一些奇怪的行为,我不太明白。 我写了一个最小的testing程序来复制这个问题: #include <boost/asio.hpp> #include <iostream> using boost::asio::ip::udp; int main(int argc,char *argv[]) { boost::asio::io_service ioService; udp::resolver resolver(ioService); udp::resolver::query queryListen("127.0.0.1","50001"); auto epListen = *resolver.resolve(queryListen); udp::socket socket(ioService,epListen); udp::resolver::query querySend("127.0.0.1","55006"); auto epSend = *resolver.resolve(querySend); boost::system::error_code err; std::array<char,12> buffer = {'1','2','3','4','5','6','7','8','9','10','11','12'}; socket.send_to( boost::asio::buffer(&buffer[0],buffer.size()), epSend,0,err ); if(!err) { std::cout<<"Sent successfully!"<<std::endl; auto numBytes = socket.receive( boost::asio::buffer(&buffer[0],buffer.size()),0, err ); if(!err) std::cout<<"Received […]

C ++套接字服务器 – 无法饱和CPU

我用C ++开发了一个小型的HTTP服务器,使用boost :: asio,现在我正在用多个客户端进行负载testing,而且我一直无法接近饱和CPU。 我正在testing一个Amazon EC2实例,使用一个cpu的50%,另一个cpu的20%,剩下的两个闲置(根据htop)。 细节: 服务器启动每个核心一个线程 请求被接收,parsing,处理,并且响应被写出 这些请求是针对从内存中读取的数据(只读用于此testing) 我使用两台机器“加载”服务器,每台机器运行一个Java应用程序,运行25个线程,发送请求 我看到大约230个请求/秒的吞吐量(这是应用程序请求,它由许多HTTP请求组成) 那么,我应该看看如何改善这个结果呢? 鉴于CPU大多是空闲的,我想利用这个额外的容量来获得更高的吞吐量,比如说800个请求/秒或者其他任何东西。 我有过的想法: 请求是非常小的,经常在几个毫秒内完成,我可以修改客户端发送/撰写更大的请求(也许使用批处理) 我可以修改HTTP服务器使用selectdevise模式,这是适当的吗? 我可以做一些分析,试图了解瓶颈是什么