If you have to answer UDP requests and may need to do separate upstream work to construct that answer, use a nonblocking socket and epoll(), or fork a thread and use a normal blocking socket. This is how DNS servers operate.
If you only listen, no answers or other work to do per request other than perhaps logging the inbound messages to the file system, a normal blocking socket is all you need. Paul Vixie