Boost logo

Boost :

Subject: Re: [boost] [asio] Multithreaded UDP server
From: Cliff Green (cliffg_at_[hidden])
Date: 2008-11-23 12:49:05


From: "Miroslav Beranič ml." <miroslav.beranic_at_[hidden]>
> I would like to do something like HTTP Server 3 ... With
> difference it uses UDP and not TCP. Basically I need UDP server that
> is (/would be) able to accept connections on multiple threads. ...
> I am stuck with accepting connections with multiple threads...

UDP is a connection-less protocol. There are no "accepting connections" with
UDP. So there's still confusion as to what you're trying to do.

With UDP you will need to create an endpoint with the port you're wanting to
receive from, then create a socket with that endpoint, then fire off an
async_receive_from (assuming you're wanting to do async), then do the
appropriate processing when the receive_from completes. Take a look at the
async_udp_server example.

There's multiple ways to hook up multi-threading with the above, but I would
recommend doing it with a single thread and extend it to multi-threaded only
when you have a good understanding of the best multi-threading design for
your needs. Opening and handling multiple UDP ports in a single thread is
easy and efficient with the above approach, and you may not gain much (if
anything) by multi-threading it.

If the main amount of work and time is taken in the processing of the
message (and not in the Asio / network handling), then I would recommend one
thread for all of the UDP async reads (as mentioned above), then the async
handler takes the incoming message / buffer and puts it on a queue. The
queue could be serviced by a thread pool, sized / tuned for your needs. This
isolates your multi-threaded design from your networking code, and makes it
much more flexible.

Cliff

 


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk