自从学习 Rust 以来,我已经成为我收集 Rust从 Haskell借来的新型习语的粉丝。
新类型是基于标准类型的独特类型,可确保函数参数的类型正确。
例如,old_enough下面的函数必须以年为单位传递年龄。它不会以天数或普通 i64 为单位编译。
struct Days(i64);
struct Years(i64);
fn old_enough(age: &Years) -> bool {
age.0 >= 18
}
Run Code Online (Sandbox Code Playgroud)
这与C++ 中的typedeforusing声明不同,它只是重命名类型。
例如,old_enough下面的函数将接受 an int、age inDays或任何其他转换为 an 的内容int:
typedef int Days;
using Years = int;
bool old_enough(Years age) {
return age >= 18;
}
Run Code Online (Sandbox Code Playgroud)
由于上面的示例仅使用整数,因此Reddit 上的这篇文章建议使用枚举类,例如:
enum class Days : int {};
enum class Years : …Run Code Online (Sandbox Code Playgroud) 我正在Boost :: ASIO中编写一个协议,它具有以下要求:
是否应该使用其他TCP套接字标志或Boost :: ASIO设置?
socket_.set_option(boost::asio::ip::tcp::no_delay(true)); // enable PSH
socket_.set_option(boost::asio::socket_base::keep_alive(true)); // enable SO_KEEPALIVE
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPIDLE>(120)); // secs before keepalive probes
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPINTVL>(10)); // interval between keepalive
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPCNT(5)); // failed keepalive before declaring dead
Run Code Online (Sandbox Code Playgroud) 一个boost-asioSSL/TLS TCP套接字实现为ssl::stream过tcp::socket:
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
Run Code Online (Sandbox Code Playgroud)
在TLS协议中,加密安全关闭涉及各方交换close_notify消息.简单地关闭最低层可能会使会话容易受到截断攻击.
在提升asio ssl async_shutdown总是以错误结束?@Tanner Sansbury在很多场景中详细描述了SSL关闭过程,并建议在关闭套接字之前使用a async_shutdown后跟a async_write断开SSL流:
ssl_socket.async_shutdown(...);
const char buffer[] = "";
async_write(ssl_socket, buffer, [](...) { ssl_socket.close(); })
Run Code Online (Sandbox Code Playgroud)
执行async_shutdownon on ssl::stream发送SSL close_notify消息并等待来自另一端的响应.async_shutdown在async_shutdown发送之后将被通知的目的是写入流,close_notify以便可以在不等待响应的情况下关闭套接字.但是,在当前(1.59)版本的boost中,调用async_write失败...
在如何优雅地关闭提升asio ssl客户端?@maxschlepzig建议关闭底层TCP套接字的接收者:
ssl_socket.lowest_layer()::shutdown(tcp::socket::shutdown_receive);
Run Code Online (Sandbox Code Playgroud)
这会产生short read错误,并async_shutdown在错误处理程序中检测到时调用:
// const boost::system::error_code &ec
if (ec.category() == asio::error::get_ssl_category() &&
ec.value() == ERR_PACK(ERR_LIB_SSL, …Run Code Online (Sandbox Code Playgroud) 我需要通过UDP与专用网络中的其他设备进行通信.我是使用boost的新手,但根据我在网上搜索的内容以及Boost网站上的教程,我提出了以下代码..我目前正在尝试从我自己的设备发送和接收数据.只是为了进行单元测试并最终确定代码.
问题:我无法收到任何消息.我错过了什么?
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include "boost/asio.hpp"
#include <thread>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#define SRVR_UDP_PORT 10251
#define CLNT_UDP_PORT 10252
boost::array<char, 1024> recv_buffer;
void Sender(std::string in)
{
boost::asio::io_service io_service;
boost::asio::ip::udp::socket socket(io_service);
boost::asio::ip::udp::endpoint remote_endpoint;
socket.open(boost::asio::ip::udp::v4());
remote_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address::from_string("192.168.1.64"), SRVR_UDP_PORT);
boost::system::error_code err;
socket.send_to(boost::asio::buffer(in.c_str(), in.size()), remote_endpoint, 0, err);
socket.close();
//int i =0;
printf("Sending Payload --- \n");
}
void handle_receive(const boost::system::error_code& error, size_t bytes_transferred)
{
std::cout << "Received: '" << std::string(recv_buffer.begin(), recv_buffer.begin()+bytes_transferred) << "'\n";
}
void Receiver()
{
while(1)
{ …Run Code Online (Sandbox Code Playgroud) 我需要一个函数来高精度地计算一对WGS 84位置之间的距离,并且我打算使用Boost几何中的geographic函数。
该升压几何设计合理的状态:
有Andoyer方法,既快速又精确,还有Vincenty方法,又慢又精确。
但是,在boost::geometry::distance同时使用Andoyer和Vincenty策略测试功能时,我得到了以下结果:
WGS 84 values (metres)
Semimajor axis: 6378137.000000
Flattening: 0.003353
Semiminor axis: 6356752.314245
Semimajor distance: 20037508.342789
Semiminor distance: 19970326.371123
Boost geometry near poles
Andoyer function:
Semimajor distance: 20037508.151445
Semiminor distance: 20003917.164970
Vincenty function:
Semimajor distance: **19970326.180419**
Semiminor distance: 20003931.266635
Boost geometry at poles
Andoyer function:
Semimajor distance: 0.000000
Semiminor distance: 0.000000
Vincenty function:
Semimajor distance: **19970326.371122**
Semiminor distance: 20003931.458623
Run Code Online (Sandbox Code Playgroud)
在Vincenty沿半长轴(即在赤道附近)距离小于周围的短半轴的距离北极和南极之间的轴。那是不正确的。 …
C++ 17 引入了许多新算法来支持并行执行,特别是std::reduce是std::accumulate的并行版本,它允许浮点加法等操作non-deterministic的行为。non-commutative我想使用 OpenCL 2 实现一个归约算法。
Intel这里有一个示例,它使用 OpenCL 2work group内核函数来实现std::exclusive_scan OpenCL 2 内核。以下是基于英特尔exclusive_scan示例的内核求和浮点数:
kernel void sum_float (global float* sum, global float* values)
{
float sum_val = 0.0f;
for (size_t i = 0u; i < get_num_groups(0); ++i)
{
size_t index = get_local_id(0) + i * get_enqueued_local_size(0);
float value = work_group_reduce_add(values[index]);
sum_val += work_group_broadcast(value, 0u);
}
sum[0] = sum_val;
}
Run Code Online (Sandbox Code Playgroud)
上面的内核可以工作(或者看起来可以!)。然而,exclusive_scan要求work_group_broadcast函数将最后一个值 1 传递work …
在升级到升级1.60.0时,某些应用程序在Windows 7上使用MinGw 4.9.2构建时无法与升级日志链接.
我收到以下链接器错误:
undefined reference to `_imp___ZN5boost3log9v2_mt_nt67trivial6logger3getEv'
undefined reference to `_imp___ZN5boost3log9v2_mt_nt63aux15stream_providerIcE17allocate_compoundERNS1_6recordE'
undefined reference to `_imp___ZN5boost3log9v2_mt_nt63aux25unhandled_exception_countEv'
undefined reference to `_imp___ZN5boost3log9v2_mt_nt611record_view11public_data7destroyEPKS3_'
bad reloc address 0x1 in section `.text$_ZNK5boost4asio5error6detail13misc_category4nameEv[__ZNK5boost4asio5error6detail13misc_category4nameEv]'
Run Code Online (Sandbox Code Playgroud)
注意:BOOST_LOG_DYN_LINK定义为:
g++ -c -pipe -fno-keep-inline-dllexport -Wall -Wextra -Wpedantic -Ofast -std=c++1y -frtti -fexceptions -mthreads -DUNICODE -DLOGGING_ENABLED -DNTDDI_VERSION=NTDDI_WIN7 -D_WIN32_WINNT=_WIN32_WINNT_WIN7 -DBOOST_THREAD_USE_LIB=1 -DBOOST_LOG_DYN_LINK=1
Run Code Online (Sandbox Code Playgroud)
boost 1.60.0构建日志文件显示boost log和boost log_setup都没有任何错误或警告,包括一些无法链接的文件,例如:
gcc.compile.c++ bin.v2\libs\log\build\gcc-mingw-4.9.2\release\threading-multi\trivial.o
gcc.compile.c++ bin.v2\libs\log\build\gcc-mingw-4.9.2\release\threading-multi\unhandled_exception_count.o
Run Code Online (Sandbox Code Playgroud)
应用程序在Windows 7上使用boost 1.59.0和MinGw 4.9.2链接正常,并在Fedora 23上使用boost 1.60.0和gcc 5.1.1链接OK.
自从提升1.58.0以来,提升asio没有改变.那么在boost 1.59.0和boost 1.60.0之间的boost日志中有什么变化导致MinGw链接在Windows上失败?
我想将 Boost 单元测试分成单独的 .cpp 文件(例如 Test1.cpp、Test2.cpp、Test3.cpp ...等),这样我就不会在单个 cpp 文件中包含 1000 个测试。到目前为止,当我尝试构建时,我遇到了各种错误。
测试1.cpp
#define BOOST_TEST_MODULE MasterTestSuite
#include <boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(myTestCase)
{
BOOST_CHECK(1 == 1);
}
Run Code Online (Sandbox Code Playgroud)
测试2.cpp
#define BOOST_TEST_MODULE MasterTestSuite2
#include <boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(myTestCase2)
{
BOOST_CHECK(2 == 2);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Boost的asio通过HTTPS连接到网站.我希望这只有在证书有效,没有过期,没有自签名等情况下才能成功.不幸的是,似乎无论如何总是有效.这是我的代码:
try
{
asio::io_service ioService;
asio::ssl::context sslContext(asio::ssl::context::sslv3_client);
sslContext.load_verify_file("cacert.pem");
asio::ip::tcp::resolver resolver(ioService);
asio::ip::tcp::resolver::query query("self-signed.badssl.com", "443");
asio::ip::tcp::resolver::iterator endpointIterator = resolver.resolve(query);
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket(ioService, sslContext);
ioService.run();
// Enable SSL peer verification.
socket.set_verify_mode(asio::ssl::verify_peer | asio::ssl::verify_fail_if_no_peer_cert);
asio::connect(socket.lowest_layer(), endpointIterator);
socket.handshake(asio::ssl::stream_base::client);
boost::asio::streambuf request;
std::ostream requestStream(&request);
requestStream << "GET / HTTP/1.0\r\n";
requestStream << "Host: self-signed.badssl.com\r\n";
requestStream << "Accept: */*\r\n";
requestStream << "Connection: close\r\n\r\n";
asio::write(socket, request);
Run Code Online (Sandbox Code Playgroud)
等等.如果我使用set_verify_callback()并false从回调中返回,连接确实会失败,但preverified似乎总是如此,即使对于https://self-signed.badssl.com/也是如此.当然那不对?
我真的很想开始使用 boost 库,但我在“安装”它时遇到了麻烦。
我希望能够通过以下方式访问该功能
#include <boost/signals2/signal.hpp>
Run Code Online (Sandbox Code Playgroud)
然后 g++ 文件名.cpp。
而不必写
#include "boost/signals2/signal.hpp"
Run Code Online (Sandbox Code Playgroud)
并在我的本地目录中有大量的 boost 。
有没有一种方法可以设置升压以使其起作用?我已经下载了 boost 库并将其解压到 /usr/local。