Boost logo

Boost Users :

Subject: Re: [Boost-users] [boost-user][asio]How can i limit tcpserver's connection count?
From: Arnaud Degroote (arnaud.degroote_at_[hidden])
Date: 2011-03-15 09:21:19


On 15/Mar - 05:32, rhapsodyn wrote:
> here‘s the code
>
> server:
> class tcp_server
> {
> public:
> tcp_server(boost::asio::io_service& io_service)
> : acceptor_(io_service),limit(0)
> {
> tcp::endpoint endpoint(tcp::v4(), 10000);
> acceptor_.open(endpoint.protocol());
> acceptor_.bind(endpoint);
> acceptor_.listen(1);
> start_accept();
> }
>
> private:
> void start_accept()
> {
> while(1)
> {
> if(limit < 1)
> break;
> }
>
> tcp::socket* socket = new tcp::socket(acceptor_.io_service());
> acceptor_.async_accept(*socket,
> boost::bind(
> &tcp_server::handle_accept,
> this,
> socket,
> boost::asio::placeholders::error));
> }
>
> void handle_accept(tcp::socket* s, const boost::system::error_code&
> error)
> {
> if (!error)
> {
> ++limit;
> start_accept();
> }
> }
>
> tcp::acceptor acceptor_;
>
> int limit;
> };
>
> client:
> int main(int argc, char* argv[])
> {
> int i = 0;
> try
> {
> boost::asio::io_service io_service;
>
> tcp::resolver resolver(io_service);
> tcp::resolver::query query("127.0.0.1", "10000");
> tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
> tcp::endpoint endpoint = *endpoint_iterator;
>
> tcp::socket socket(io_service);
> socket.connect(endpoint);
>
> while(1)
> {}
> }
> catch (std::exception& e)
> {
> std::cerr << e.what() << std::endl;
> }
>
> return 0;
> }
>
> I thought i can only launch 1 client, but fact is: i can start two clients
> and the 3rd one just cerr the what(), what happend there? Is there some
> better way to get & limit the "living-connection" of the server?

I'm not 100% sure but :
   - the first one is accepted, as expected
   - the second one is queued, in the listen queue (size of queue = 1)
   - the third one is discarded, as the queue is full, and the system
         returns a ECONNREFUSED

However, you only have "active client" at any time. Moreover, the current
implementation is really bad. Your active wait completely blocks the
asynchronous queue, defeating the purpose of the asynchronous
implementation. If you don't want to accept anymore connection, don't
call start_accept() if (limit > threshold).

Regards,

-- 
Arnaud Degroote
PhD Student 
RIA LAAS / CNRS



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