catch some errors from asio methods/functions explicitly
otherwise it would result in an uncatchable exception and force the program to terminate. some exceptions are still considered super rare and fatal, and they are still propagated (mainly from the io_service and deadline timer). errors on close() are just ignored (there wouldn't be much we can do to recover in this case anyway). Further, changed the handling of errors on the result of async_accept(): instead of stop accepting on some errors, log them and keep accepting new connections. on a closer look at the code I believe that's more appropriate; silent stop would be rather confusing (if the error were really fatal we should rather invoke an exception and trigger termination), and cases like EMFILE definitely shouldn't cause this situation. errors that can caused by stop() should still result in stopping accept(), and the new code behaves that way.
Showing with 62 additions and 38 deletions