birney
birney

Reputation: 31

boost asio tcp server

Ive currently been messing around with boost trying it out. When i try to make a simple multi threaded echo server it exits when receiving with error code 3. I have looked over the documentation many times and still no luck. I know it is probably something very simple i'm overlooking. I have decent experience with winsock but i would like to learn the boost library.

here is the code thats failing i took out the

typedef boost::shared_ptr<tcp::socket> socket_ptr;
boost::asio::io_service io;
boost::array<char, 512> buf;

void startserver ( std::string host, std::string port )
{
    tcp::acceptor a (io, tcp::endpoint(tcp::v4(), atoi(port.c_str())));
    for(;;)
    {
        socket_ptr sock (new tcp::socket(io));
        a.accept(*sock);
        std::cout << sock->remote_endpoint() << std::endl;
        boost::thread t (boost::bind(session, sock));
     }
}

void session ( socket_ptr sock ) 
{
    sock->send(boost::asio::buffer("welcome"),0,er);
    size_t len;
    for(;;)
    {
        len = sock->receive(boost::asio::buffer(buf));

        sock->send(boost::asio::buffer(buf,len),0,er);
    }

}

I can connect to it fine with netcat and it receives the welcome message but right when it goes to receive it crashs. Ive tried catching an error using boost::system::error_code on each one but nothing was returned

Upvotes: 2

Views: 3184

Answers (2)

Galimov Albert
Galimov Albert

Reputation: 7357

There are too many issues. Check asio documentation for correct examples. Some of issues:

  1. Creating boost::thread object t and then immediately exit scope. This deattaches thread and it not controllable now; or, as mentioned Joachim Pileborg it can terminate (im not very familiar with boost::threads, so correct me if i wrong).
  2. Right after this you starting new acceptor. You should hold only 1 acceptor per listening port.
  3. No point to create thread for this at all, it is ASIO, use async ;)
  4. receive does not wait data, it just fetch packet data ASIO already had (what is not true in this case)

Check examples at boost site, i think your case is blocking tcp echo server

Upvotes: 5

Some programmer dude
Some programmer dude

Reputation: 409176

It's most likely because the thread goes out of scope. From the manual page of the boost::thread destructor:

If the thread is joinable calls to std::terminate. Destroys *this.

This means that when the thread is started it might run for a little while before the thread in startserver gets control again and the thread object is destructed and your thread is terminated.

Upvotes: 1

Related Questions