|
@@ -17,6 +17,7 @@
|
|
#include <netinet/in.h>
|
|
#include <netinet/in.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/socket.h>
|
|
#include <unistd.h> // for some IPC/network system calls
|
|
#include <unistd.h> // for some IPC/network system calls
|
|
|
|
+#include <errno.h>
|
|
|
|
|
|
#include <boost/shared_array.hpp>
|
|
#include <boost/shared_array.hpp>
|
|
|
|
|
|
@@ -83,11 +84,21 @@ TCPServer::operator()(error_code ec, size_t length) {
|
|
/// Create a socket to listen for connections
|
|
/// Create a socket to listen for connections
|
|
socket_.reset(new tcp::socket(acceptor_->get_io_service()));
|
|
socket_.reset(new tcp::socket(acceptor_->get_io_service()));
|
|
|
|
|
|
- /// Wait for new connections. In the event of error,
|
|
|
|
|
|
+ /// Wait for new connections. In the event of non-fatal error,
|
|
/// try again
|
|
/// try again
|
|
do {
|
|
do {
|
|
CORO_YIELD acceptor_->async_accept(*socket_, *this);
|
|
CORO_YIELD acceptor_->async_accept(*socket_, *this);
|
|
- } while (!ec);
|
|
|
|
|
|
+ // Abort on fatal errors
|
|
|
|
+ // TODO: Log error?
|
|
|
|
+ if (ec) {
|
|
|
|
+ using namespace asio::error;
|
|
|
|
+ if (ec.value() != would_block && ec.value() != try_again &&
|
|
|
|
+ ec.value() != connection_aborted &&
|
|
|
|
+ ec.value() != interrupted) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } while (ec);
|
|
|
|
|
|
/// Fork the coroutine by creating a copy of this one and
|
|
/// Fork the coroutine by creating a copy of this one and
|
|
/// scheduling it on the ASIO service queue. The parent
|
|
/// scheduling it on the ASIO service queue. The parent
|