Boost logo

Boost Users :

Subject: [Boost-users] [asio] An error occured in asio::win_mutex.hpp
From: Yasuhiko Yoshimura \(informax.co.jp\) (yoshimura_at_[hidden])
Date: 2010-09-15 06:44:13


Hi ALL,
 
I have encountered this error, and would like to program a win32 FTP client with asio lib.
In asio examples I reffenrenced at the 'Services(logger program)'.
 
Could you help me ?
I appriciate any suggestion.
 
Thank all,
Yasuhiko Yoshimura (Japan)
 

An accsess violence occured at the below ===>> point.
 
win_mutex.hpp:line 125:
------------------------------------------------------------------------
Then variable values are:
 &crit_section_ 0xcdcdcdcd
 this 0xcdcdcdcd (boost::noncopyable_::noncopyable)
 
  // Locking must be performed in a separate function to lock() since the
  // compiler does not support the use of structured exceptions and C++
  // exceptions in the same function.
  int do_lock()
  {
    __try
    {
===>> ::EnterCriticalSection(&crit_section_);
    }
    __except(GetExceptionCode() == STATUS_INVALID_HANDLE
        || GetExceptionCode() == STATUS_NO_MEMORY
        ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
      if (GetExceptionCode() == STATUS_NO_MEMORY)
        return ERROR_OUTOFMEMORY;
      return ERROR_INVALID_HANDLE;
    }
 
    return 0;
  }
------------------------------------------------------------------------
 
Here are my codes below.
And error point was ===>>
------------------------------------------------------------------------
using boost::asio::ip::tcp;
 
class ftp_client_dtp
  : public boost::enable_shared_from_this<ftp_client_dtp>
{
public:
 typedef boost::shared_ptr<ftp_client_dtp> pointer;
 
 static pointer create(boost::asio::io_service& io_service)
 {
  return pointer(new ftp_client_dtp(io_service));
 }
 tcp::socket& socket()
 {
  return *work_socket_;
 }
 ...
 void start()
 {
  work_thread_.reset(new boost::thread(
    boost::bind(&boost::asio::io_service::run, &work_io_service_)));
 
  // Start an asynchronous resolve to translate the server and service names
  // into a list of endpoints.
 
  tcp::resolver::query query(sip_, sport_);
  work_resolver_->async_resolve(query,
   boost::bind(&ftp_client_dtp::handle_resolve, shared_from_this(),
   boost::asio::placeholders::error,
   boost::asio::placeholders::iterator));
 }
 void close()
 {
  work_io_service_.post(boost::bind(&ftp_client_dtp::do_close, shared_from_this()));
 }
 ftp_client_dtp(boost::asio::io_service& io_service)
    : work_io_service_(),
    work_resolver_(new boost::asio::ip::tcp::resolver(work_io_service_)),
    work_socket_(new boost::asio::ip::tcp::socket(work_io_service_))
===>> {
 }
 ~ftp_client_dtp()
 {
  work_.reset();
  if (work_thread_)
   work_thread_->join();
 }
private:
 std::ofstream f;
 
 void handle_resolve(const boost::system::error_code& err,
  tcp::resolver::iterator endpoint_iterator)
 {
  ...
 }
 void handle_connect(const boost::system::error_code& err,
  tcp::resolver::iterator endpoint_iterator)
 {
  ...
 }
 void handle_read_content(const boost::system::error_code& err)
 {
  ...
 }
 void do_close()
 {
  work_socket_->close();
 }
 
 std::string sip_, sport_, scurrentpath_, sfilename_;
 
 boost::asio::streambuf request_;
 boost::asio::streambuf response_;
 
 boost::scoped_ptr<boost::asio::ip::tcp::resolver> work_resolver_;
 boost::scoped_ptr<boost::asio::ip::tcp::socket> work_socket_;
 
 boost::asio::io_service work_io_service_;
 boost::scoped_ptr<boost::asio::io_service::work> work_;
 boost::scoped_ptr<boost::thread> work_thread_;
};
 
ftp_client_dtp::pointer new_connection_;
 
new_connection_ = ftp_client_dtp::create(io_service_);
 
new_connection_->start();
------------------------------------------------------------------------

Thank all,
Yasuhiko Yoshimura (Japan)
 



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net