Advertisement
AlexNovoross87

prob

Jun 8th, 2025 (edited)
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. В Run() мы фактически запускаем синхронно Read, A в Write уже синхронная запись идет, а насколько я помню, при синхронном выполнении операции рабочий екзекутор не нужен... поэтому в Write если запрос на запрись пришел с другой стороны, сделать stream->cancel()..
  2. записать все что нужно, и если запрос был изнутри, то в OnWrite вызвать снова Read(), А если запрос был снаружи то вызвать Run(), так как была отмена всех операций на стриме...
  3.  
  4. Просто я не знаю если взведенная асинк-рид стоит, можно ли в этот момент что-то писать в сокет... или надо вызвать отмену асинхронного ожидания, записать что нужно и снова запустить..
  5.  
  6. void AbstractSession::Run()
  7. {
  8. net::dispatch(stream_->get_executor(),
  9. beast::bind_front_handler(
  10. &AbstractSession::Read,
  11. shared_from_this()));
  12. };
  13.  
  14.  
  15. void AbstractSession::Write(DIR dir,std::string responce_body, http::status status)
  16. { std::lock_guard<std::mutex> lg(mtx_use_write_);
  17.  
  18. if(dir == OUTER){ stream -> cancel() } ????? //если запрос пришел из вне
  19. OnWrite(dir, true, ec, bytes);
  20.  
  21. }
  22.  
  23. void AbstractSession::OnWrite(DIR dir, bool keep_alive, beast::error_code ec, std::size_t bytes_transferred)
  24. {
  25. if(dir == AbstractSession::DIR::OUTER) {Run();} //Если была отмена операций на стриме
  26. else{ Read();};
  27. }
  28.  
  29.  
  30.  
  31.  
  32.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement