int newsock = accept (sock,(struct sockaddr *) &clientname,&size);
if (newsock < 0)
{
- if (errno == EAGAIN)
+ // return on non-fatal errors (list taken from man-page)
+ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ECONNABORTED || errno == EINTR ||
+ errno == EMFILE || errno == ENFILE || errno == ENOBUFS || errno == ENOMEM ||
+ errno == EPROTO || errno == EPERM || errno == ETIMEDOUT)
{
- LOGSTREAM(error,"accept error (EAGAIN): no connection waiting");
+ LOGSTREAM(error,"non-fatal accept error: " << strerror(errno));
return;
}
- /* default: break */
- EXCEPTIONSTREAM(error,t2n_server_error,"error accepting connection: " << strerror(errno));
+ /* fatal error: will usually kill or restart the server */
+ EXCEPTIONSTREAM(error,t2n_server_error,"fatal error accepting connection: " << strerror(errno));
}
FD_SET (newsock, &connection_set);
/// call fill_buffer() on all connections, called from fill_buffer()
bool socket_server::fill_connection_buffers()
{
- bool data_found;
+ bool data_found = false;
std::map<unsigned int, server_connection*>::iterator ie=connections.end();
for(std::map<unsigned int, server_connection*>::iterator i=connections.begin(); i != ie; i++)
if (!i->second->server_connection::is_closed())
- if (i->second->fill_buffer(0))
- data_found=true;
+ {
+ // shutdown all connections which throw exceptions to protect the server
+ try
+ {
+ if (i->second->fill_buffer(0))
+ data_found=true;
+ }
+ catch (t2n_transfer_error &e)
+ { i->second->close(); }
+ catch(...)
+ { throw; }
+ }
return data_found;
}