fixes for network errors discovered with new connection stress test example

This commit is contained in:
Peter Thorson
2011-12-09 09:40:15 -06:00
parent 0e9b0b99cf
commit 8c0ffeaf91
11 changed files with 714 additions and 10 deletions

View File

@@ -44,6 +44,18 @@ using boost::asio::ip::tcp;
namespace websocketpp {
namespace role {
/*class client_exception : public std::exception {
public:
client_exception(const std::string& msg) : m_msg(msg {}
~client_exception() throw() {}
virtual const char* what() const throw() {
return m_msg.c_str();
}
std::string m_msg;
};*/
template <class endpoint>
class client {
public:
@@ -254,12 +266,32 @@ void client<endpoint>::handle_connect(connection_ptr con,
m_state = CONNECTED;
con->start();
} else {
m_endpoint.elog().at(log::elevel::ERROR)
<< "An error occurred while establishing a connection: "
<< error << log::endl;
// TODO: fix
throw "client error";
if (error == boost::system::errc::connection_refused) {
m_endpoint.elog().at(log::elevel::ERROR)
<< "An error occurred while establishing a connection: "
<< error << " (connection refused)" << log::endl;
} else if (error == boost::system::errc::operation_canceled) {
m_endpoint.elog().at(log::elevel::ERROR)
<< "An error occurred while establishing a connection: "
<< error << " (operation canceled)" << log::endl;
} else if (error == boost::system::errc::connection_reset) {
m_endpoint.elog().at(log::elevel::ERROR)
<< "An error occurred while establishing a connection: "
<< error << " (connection reset)" << log::endl;
} else if (error == boost::system::errc::timed_out) {
m_endpoint.elog().at(log::elevel::ERROR)
<< "An error occurred while establishing a connection: "
<< error << " (operation timed out)" << log::endl;
} else if (error == boost::system::errc::broken_pipe) {
m_endpoint.elog().at(log::elevel::ERROR)
<< "An error occurred while establishing a connection: "
<< error << " (broken pipe)" << log::endl;
}else {
m_endpoint.elog().at(log::elevel::ERROR)
<< "An error occurred while establishing a connection: "
<< error << " (unknown)" << log::endl;
throw "client error";
}
}
}
@@ -317,7 +349,9 @@ void client<endpoint>::connection<connection_type>::handle_write_request(
const boost::system::error_code& error)
{
if (error) {
m_endpoint.elog().at(log::elevel::ERROR) << "Error writing WebSocket request. code: " << error << log::endl;
m_endpoint.elog().at(log::elevel::ERROR) << "Error writing WebSocket request. code: " << error << log::endl;
m_connection.terminate(false);
return;

View File

@@ -231,7 +231,15 @@ void server<endpoint>::handle_accept(connection_ptr con,
const boost::system::error_code& error)
{
if (error) {
m_ws_endpoint.elog().at(log::elevel::ERROR) << "async_accept returned error: " << error << log::endl;
if (error == boost::system::errc::too_many_files_open) {
m_ws_endpoint.elog().at(log::elevel::ERROR)
<< "async_accept returned error: " << error
<< " (too many files open)" << log::endl;
} else {
m_ws_endpoint.elog().at(log::elevel::ERROR)
<< "async_accept returned error: " << error
<< " (unknown)" << log::endl;
}
} else {
con->start();
}
@@ -502,8 +510,21 @@ void server<endpoint>::connection<connection_type>::log_open_result() {
std::stringstream version;
version << "v" << m_version << " ";
std::string remote;
boost::system::error_code ec;
boost::asio::ip::tcp::endpoint ep = m_connection.get_raw_socket().remote_endpoint(ec);
if (ec) {
// An error occurred.
//remote = "Unknown";
//ignore?
m_endpoint.elog().at(log::elevel::WARN) << "Error getting remote endpoint. code: " << ec << log::endl;
} else {
}
m_endpoint.alog().at(log::alevel::CONNECT) << (m_version == -1 ? "HTTP" : "WebSocket") << " Connection "
<< m_connection.get_raw_socket().remote_endpoint() << " "
<< ep << " "
<< (m_version == -1 ? "" : version.str())
<< (get_request_header("User-Agent") == "" ? "NULL" : get_request_header("User-Agent"))
<< " " << m_uri->get_resource() << " " << m_response.get_status_code()

View File

@@ -77,7 +77,7 @@ public:
void async_init(socket_init_callback callback) {
// TODO: should this use post()?
m_socket.set_option(boost::asio::ip::tcp::no_delay(true));
//m_socket.set_option(boost::asio::ip::tcp::no_delay(true));
callback(boost::system::error_code());
}