Boost.Asio udp::endpoint有一个远程地址的成员.因为我正在监听多个接口(如下所示):
udp_socket(io_service, udp::endpoint(udp::v4(), port))
Run Code Online (Sandbox Code Playgroud)
在我的处理程序中,我不知道哪个网络接口收到了数据包.
如果没有遍历网络接口并在每个接口上寻找端点地址和我的IP之间的相似性,我可以从我收到消息的接口获取IP吗?
我有用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.
我正在尝试使用Boost Asio而不是RakNet,所以我试图跟随Boost网站上的示例,但我有一些问题没有得到答复.这是链接:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/tutorial/tutdaytime1.html
只是抬头,我得到了教程,客户端和服务器.
1)为什么查询需要字符串"daytime"?在服务器设置中找不到它.当我使用该字符串时,客户端似乎只是连接.(试过"测试"并没有连接)
2)为什么我不需要为客户端提供连接端口?它是否会搜索此端口本身,还是可以选择手动设置此端口?
提前致谢.
我是否创建了一个所有 SSL套接字共享的链,或者每个SSL上下文一个链(由任何相关的套接字共享)?
Boost.Asio SSL文档声明了这一点,但它没有提到上下文.我认为这意味着我必须只使用一个链,但我认为这是在OpenSSL支持多线程之前编写的.
SSL和线程
SSL流对象不执行自己的锁定.因此,必须在隐式或显式链中执行所有异步SSL操作.请注意,这意味着在单线程程序中不需要同步(因此不会产生锁定开销).
我很可能只有一个SSL上下文,但我想知道这个链是由SSL上下文还是全局网络服务所拥有的更合适.
我确实提供了一个处理程序CRYPTO_set_locking_callback,以防万一.
我以异步方式使用非 Boost Asio。我通过网络发送数据包,其格式如下:
因此,当我想首先接收包裹时,我使用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正在调用独占。
这种行为的原因是什么?
鉴于以下测试计划:
#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).
但是,看起来好像包裹已打开内包装.
这是预期的行为吗?
我们使用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 版本。
Asio v 1.11。该文档说basic_stream_socket::get_io_service()成员函数已被弃用,get_executor()必须改用。但后者executor不返回io_service。
如何获取对io_servicesocket使用的对象的引用来构造另一个?
我正在尝试使用boost :: program_options来读取包含多个部分的ini文件:
[slave]
address=localhost
port=1111
[slave]
address=192.168.0.1
port=2222
Run Code Online (Sandbox Code Playgroud)
有什么解决方案吗?
提前致谢!
我正在使用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)