委托使用 boost asio TCP/IP 套接字
Delegate use of boost asio TCP/IP socket
我创建了一个 TCP 客户端,它有一个 boost asio tcp 套接字并且进行异步读取:
class TCPClient {
public:
TCPClient(boost::asio::io_service& io_service)
: socket_(io_service) {
// Connect
[...]
// Asynchronous read
socket_.async_read_some(boost::asio::buffer(buffer, buffer.size()),
boost::bind(&TCPClient::handlerRead,
this,
placeholders::error,
placeholders::bytes_transferred));
}
~TCPClient() {}
void handlerRead(const boost::system::error_code& ec, uint32_t bytes) {
if (!ec) {
// process
[...]
socket_.async_read_some(
boost::asio::buffer(buffer, buffer.size()),
boost::bind(&TCPClient::handlerRead,
this,
placeholders::error,
placeholders::bytes_transferred));
}
int getSocketFd() {
return socket_.native_handle();
}
private:
boost::asio::tcp::socket socket_;
};
这工作正常。
但是当我把它放在一个线程中时:
boost::asio::io_service io_service;
auto client = new TCPClient(io_service);
std::thread{[&io_service](){ io_service.run(); }};
...并获取套接字的文件描述符:
int socket_fd = client->getSocketFd();
因为我想让这部分程序使用TCP/IP套接字在这个套接字上发送数据包。
但是,我的程序出现了这个错误的段错误:
#1 0x000000000041fab0 in boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) ()
#2 0x0000000000420b5f in boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const&) ()
#3 0x00000000004207df in boost::asio::detail::task_io_service::run(boost::system::error_code&) ()
#4 0x0000000000420eab in boost::asio::io_service::run() ()
你知道这里发生了什么吗?
您在一个线程的堆栈上定义 io_service
。但是你从不同的线程访问它。似乎在 .run()
调用的那一刻,该对象不再存在。
将它移动到堆是一种可能性。无论如何,需要对代码、组件和活性之间的关系进行更深入的分析。
我创建了一个 TCP 客户端,它有一个 boost asio tcp 套接字并且进行异步读取:
class TCPClient {
public:
TCPClient(boost::asio::io_service& io_service)
: socket_(io_service) {
// Connect
[...]
// Asynchronous read
socket_.async_read_some(boost::asio::buffer(buffer, buffer.size()),
boost::bind(&TCPClient::handlerRead,
this,
placeholders::error,
placeholders::bytes_transferred));
}
~TCPClient() {}
void handlerRead(const boost::system::error_code& ec, uint32_t bytes) {
if (!ec) {
// process
[...]
socket_.async_read_some(
boost::asio::buffer(buffer, buffer.size()),
boost::bind(&TCPClient::handlerRead,
this,
placeholders::error,
placeholders::bytes_transferred));
}
int getSocketFd() {
return socket_.native_handle();
}
private:
boost::asio::tcp::socket socket_;
};
这工作正常。 但是当我把它放在一个线程中时:
boost::asio::io_service io_service;
auto client = new TCPClient(io_service);
std::thread{[&io_service](){ io_service.run(); }};
...并获取套接字的文件描述符:
int socket_fd = client->getSocketFd();
因为我想让这部分程序使用TCP/IP套接字在这个套接字上发送数据包。 但是,我的程序出现了这个错误的段错误:
#1 0x000000000041fab0 in boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) ()
#2 0x0000000000420b5f in boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const&) ()
#3 0x00000000004207df in boost::asio::detail::task_io_service::run(boost::system::error_code&) ()
#4 0x0000000000420eab in boost::asio::io_service::run() ()
你知道这里发生了什么吗?
您在一个线程的堆栈上定义 io_service
。但是你从不同的线程访问它。似乎在 .run()
调用的那一刻,该对象不再存在。
将它移动到堆是一种可能性。无论如何,需要对代码、组件和活性之间的关系进行更深入的分析。