小编Tan*_*ury的帖子

如何从udp端点获取*my*ip

Boost.Asio udp::endpoint有一个远程地址的成员.因为我正在监听多个接口(如下所示):

udp_socket(io_service, udp::endpoint(udp::v4(), port))
Run Code Online (Sandbox Code Playgroud)

在我的处理程序中,我不知道哪个网络接口收到了数据包.

如果没有遍历网络接口并在每个接口上寻找端点地址和我的IP之间的相似性,我可以从我收到消息的接口获取IP吗?

c++ boost boost-asio

7
推荐指数
1
解决办法
2319
查看次数

ImportError:/usr/lib/libboost_python.so.1.54.0:未定义的符号:PyClass_Type

我有用C++编写的代码:

#include <boost/python.hpp>

char const* greet()
{
  return "Yay!";
}

BOOST_PYTHON_MODULE(libtest)
{
  using namespace boost::python;
  def("greet", greet);
} 
Run Code Online (Sandbox Code Playgroud)

现在我想通过以下方式将此动态库导入到python:

import libtest
Run Code Online (Sandbox Code Playgroud)

但我得到:

ImportError: /usr/lib/libboost_python.so.1.54.0: undefined symbol: PyClass_Type
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我的操作系统是Arch Linux.

c++ python boost boost-python archlinux

6
推荐指数
1
解决办法
1万
查看次数

Boost Asio:关于本教程的一些问题(同步日间服务器/客户端)

我正在尝试使用Boost Asio而不是RakNet,所以我试图跟随Boost网站上的示例,但我有一些问题没有得到答复.这是链接:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/tutorial/tutdaytime1.html

只是抬头,我得到了教程,客户端和服务器.

1)为什么查询需要字符串"daytime"?在服务器设置中找不到它.当我使用该字符串时,客户端似乎只是连接.(试过"测试"并没有连接)

2)为什么我不需要为客户端提供连接端口?它是否会搜索此端口本身,还是可以选择手动设置此端口?

提前致谢.

c++ boost boost-asio

6
推荐指数
1
解决办法
920
查看次数

Boost.Asio SSL线程安全

我是否创建了一个所有 SSL套接字共享的链,或者每个SSL上下文一个链(由任何相关的套接字共享)?

Boost.Asio SSL文档声明了这一点,但它没有提到上下文.我认为这意味着我必须只使用一个链,但我认为这是在OpenSSL支持多线程之前编写的.

SSL和线程

SSL流对象不执行自己的锁定.因此,必须在隐式或显式链中执行所有异步SSL操作.请注意,这意味着在单线程程序中不需要同步(因此不会产生锁定开销).

我很可能只有一个SSL上下文,但我想知道这个链是由SSL上下文还是全局网络服务所拥有的更合适.

我确实提供了一个处理程序CRYPTO_set_locking_callback,以防万一.

c++ multithreading boost openssl boost-asio

6
推荐指数
2
解决办法
1824
查看次数

使用 async_read 和 asio::transfer_exactly (非 Boost Asio)

我以异步方式使用非 Boost Asio。我通过网络发送数据包,其格式如下:

  • 包大小:uint64
  • 主体包:uchar *(包的大小)

因此,当我想首先接收包裹时,我使用asio::transfer_exactly助手等待包裹大小:

asio::async_read(socket, buffer, asio::transfer_exactly(sizeof(uint64_t)), handler);
Run Code Online (Sandbox Code Playgroud)

处理程序签名如下所示:

void handler(const asio::error_code& error, std::size_t bytes_transferred);
Run Code Online (Sandbox Code Playgroud)

但有时此处理程序以bytes_transferred = 0执行(错误不包含任何错误)并且缓冲区不包含必要的数据(包的大小)。之后,进一步的传输挂起。

套接字中没有其他读取操作,因此async_read正在调用独占。

这种行为的原因是什么?

c++ boost boost-asio

6
推荐指数
0
解决办法
1660
查看次数

asio 1.11.0独立包装不正确......还是我?

鉴于以下测试计划:

#include <asio.hpp>
#include <cassert>

int main()
{
    asio::io_service ios1, ios2;
    asio::io_service::strand s2(ios2);

    auto test_func = wrap(s2, [&] {
        assert(s2.running_in_this_thread());
    });

    auto wrap_test_func = wrap(ios1, test_func);

    wrap_test_func();

    ios1.run_one();
    ios2.run_one();

}
Run Code Online (Sandbox Code Playgroud)

我的理解是这个程序不应断言.

wrap_test_func被包裹进去io_service ios1.它包装的功能被包装strand s2(使用ios2).

根据我的理解,调用wrap_test_func应该等于dispatch(ios1, test_func)哪个应该发送lambda in s2).

但是,看起来好像包裹已打开内包装.

这是预期的行为吗?

c++ boost-asio

6
推荐指数
1
解决办法
377
查看次数

C++ Boost asio (OpenSSL) 获取活动连接的密码和 TLS/SSL 版本

我们使用Boost asio 进行一些 SSL 通信。连接和通信工作正常,但现在我们想显示连接使用的实际TLS版本和密码。

我们用于SSL连接的 Boost asio 对象定义如下:

typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
boost::shared_ptr<ssl_socket>   m_psslsocket;
boost::asio::ssl::context* m_pcontext;
Run Code Online (Sandbox Code Playgroud)

看起来 Boost asio 实际上并没有一个接口来在设置后查询密码连接。

我可以通过调用以下命令来获取 OpenSSL SSL_CTX* 指针:

SSL_CTX* ctx = pContext->impl(); 
Run Code Online (Sandbox Code Playgroud)

或者通过调用 OpenSSL SSL*:

m_psslsocket->native_handle()
Run Code Online (Sandbox Code Playgroud)

但从 OpenSSL 文档中我无法弄清楚如何从中获取使用的密码和 TLS 版本。

c++ boost openssl boost-asio

6
推荐指数
1
解决办法
1334
查看次数

已弃用的 get_io_service() 的替代方法

Asio v 1.11。该文档说basic_stream_socket::get_io_service()成员函数已被弃用,get_executor()必须改用。但后者executor不返回io_service

如何获取对io_servicesocket使用的对象的引用来构造另一个?

boost-asio

6
推荐指数
1
解决办法
5088
查看次数

boost :: program_options和ini文件中的多个部分

我正在尝试使用boost :: program_options来读取包含多个部分的ini文件:

[slave]
address=localhost
port=1111

[slave]
address=192.168.0.1
port=2222
Run Code Online (Sandbox Code Playgroud)

有什么解决方案吗?

提前致谢!

c++ boost-program-options

5
推荐指数
1
解决办法
3226
查看次数

提升asio http服务器,怎么停?

我正在使用boost附带的一个示例http服务器(在doc/html/boost_asio/example/cpp03/http/server,或者在http://www.boost.org/doc/libs/1_55_0/) doc/html/boost_asio/examples/cpp03_examples.html#boost_asio.examples.cpp03_examples.http_server).

该示例打开一个接受器套接字并侦听,剥离请求对象的请求.服务器还有一个boost asio signal_set,用于注册信号处理程序,并在收到SIGINT或SIGTERM时从io_service中取消所有asio请求.按CTRL-C键接收信号,io_service调出一个handle_stop()函数,然后调用.close()所有函数asio::ip::tcp::sockets.整个服务器正常关闭,io_service.run()呼叫退出,程序结束.

我希望能够在一个线程中启动这个http服务器,然后以编程方式取消它而不是使用信号.这样做的可接受方式是什么?我删除了signal_set信号处理程序,然后在另一个线程上启动了服务器.它可以很好地处理来自新线程的http请求.如何从另一个线程中阻止它?asio::ip::tcp::socket::close()从另一个线程调用是否安全?文档不清楚,只是这样做感觉非常,非asio-ish.实际上,当我尝试这样做时,只要我还没有接受任何http请求,它就能正常工作.如果我甚至处理了一个http请求,那么进程会在boost中崩溃:

>   test_ssl_server_sa.exe!boost::detail::sp_counted_base::add_ref_lock()  Line 81 + 0x3 bytes  C++
    test_ssl_server_sa.exe!boost::detail::shared_count::shared_count(const boost::detail::weak_count & r={...})  Line 578 + 0x12 bytes  C++
    test_ssl_server_sa.exe!boost::shared_ptr<http::server::connection>::shared_ptr<http::server::connection><http::server::connection>(const boost::weak_ptr<http::server::connection> & r={...})  Line 405 + 0x3f bytes    C++
    test_ssl_server_sa.exe!boost::enable_shared_from_this<http::server::connection>::shared_from_this()  Line 49 + 0xc bytes    C++
    test_ssl_server_sa.exe!http::server::connection::handle_handshake(const boost::system::error_code & error={...})  Line 83 + 0x11 bytes  C++
    test_ssl_server_sa.exe!boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>::operator()(http::server::connection * p=0x004b8fe8, const boost::system::error_code & a1={...})  Line 165 + …
Run Code Online (Sandbox Code Playgroud)

c++ sockets multithreading boost boost-asio

5
推荐指数
1
解决办法
907
查看次数