can you help me with little problem?
I have 2 class: Form1 async_srv
When i start application, Form1 create async_srv instance. And listening my socket, all recieved data sending to main class and return answer from her. When get -1, i want destoy acceptor/service/thread and my Application. But this not going. Any suggestions?
My async_srv.h
#include "Form1.h"
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
typedef boost::shared_ptr<boost::asio::ip::tcp::socket> socket_ptr;
typedef boost::shared_ptr<boost::asio::ip::tcp::acceptor> acc_ptr;
class async_srv
{
private:
boost::thread* srv_thread;
boost::asio::streambuf response;
std::stringstream s;
int stop;
TForm* ourForm;
boost::shared_ptr<boost::asio::io_service> m_ioservice;
protected:
void start();
void start_accept(acc_ptr acc,socket_ptr sock);
void handle_accept(acc_ptr acc, socket_ptr sock);
public:
__fastcall async_srv(TForm* Form1);
void kill();
};
My async_srv.cpp
fastcall async_srv::async_srv(TForm* Form1): m_ioservice(boost::make_shared<boost::asio::io_service>())
{
//create Pointer to main form
ourForm = Form1;
//create thread to async recieve for realease this class
srv_thread = new boost::thread(boost::bind(&async_srv::start, this));
}
void async_srv::start()
{
//create acceptor, and socket.
acc_ptr acc(new boost::asio::ip::tcp::acceptor(*m_ioservice, ep));
socket_ptr sock(new boost::asio::ip::tcp::socket(*m_ioservice));
//start_accept
start_accept(acc,sock);
m_ioservice->run();
}
void async_srv::start_accept(acc_ptr acc,socket_ptr sock)
{
// async accept
acc->async_accept(*sock, boost::bind(&async_srv::handle_accept, this, acc, sock));
}
void async_srv::handle_accept(acc_ptr acc, socket_ptr sock)
{
//loop for recieve data
while (boost::asio::read(*sock, response, boost::asio::transfer_at_least(1), error))
s << &response;
if (s.str() != "")
{
//recieve answer from main
stop = ourForm->update(s.str());
if(stop == -1)
{
//kill our class and application
acc->close();
kill();
Application->Terminate();
return;
}
}
s.str(std::string());
response.consume(response.size());
start_accept(acc,sock);
}
void async_srv::kill()
{
m_ioservice->stop();
srv_thread->~thread();
}