Tôi đang học Boost :: asio và tất cả những thứ không đồng bộ. Làm thế nào tôi có thể đọc không đồng bộ với biến số user_
của loại std :: string? Boost::asio::buffer(user_)
chỉ hoạt động với async_write()
, nhưng không hoạt động với async_read()
. Nó hoạt động với vector, vậy lý do cho nó không làm việc với chuỗi là gì? Có cách nào khác để làm điều đó ngoài việc khai báo char user_[max_len]
và sử dụng Boost::asio::buffer(user_, max_len)
?Cách đọc không đồng bộ đến std :: string using Boost :: asio?
Ngoài ra, điểm kế thừa từ boost::enable_shared_from_this<Connection>
và sử dụng shared_from_this()
thay vì this
trong async_read()
và async_write()
là gì? Tôi đã thấy rất nhiều trong các ví dụ.
Đây là một phần của mã của tôi:
class Connection
{
public:
Connection(tcp::acceptor &acceptor) :
acceptor_(acceptor),
socket_(acceptor.get_io_service(), tcp::v4())
{ }
void start()
{
acceptor_.get_io_service().post(
boost::bind(&Connection::start_accept, this));
}
private:
void start_accept()
{
acceptor_.async_accept(socket_,
boost::bind(&Connection::handle_accept, this,
placeholders::error));
}
void handle_accept(const boost::system::error_code& err)
{
if (err)
{
disconnect();
}
else
{
async_read(socket_, boost::asio::buffer(user_),
boost::bind(&Connection::handle_user_read, this,
placeholders::error, placeholders::bytes_transferred));
}
}
void handle_user_read(const boost::system::error_code& err,
std::size_t bytes_transferred)
{
if (err)
{
disconnect();
}
else
{
...
}
}
...
void disconnect()
{
socket_.shutdown(tcp::socket::shutdown_both);
socket_.close();
socket_.open(tcp::v4());
start_accept();
}
tcp::acceptor &acceptor_;
tcp::socket socket_;
std::string user_;
std::string pass_;
...
};