示例#1
0
 void OnReceived(_UInt32 nbytes, StreamBuffer::Node* node, const error_code& error)
 {
     m_PendingRecvRequestCount--;
     node->m_Len = nbytes;
     m_Wrapper->m_IStream.PushNode(node);
     if (error.value() != 0)
     {
         if (m_PendingRecvRequestCount == 0 && m_RequestSendRequestCount == 0)
         {
             if (!(error.value() == 104 || error.value() == 54))
             {
                 m_Wrapper->Close();
             }
             if (!m_Wrapper->m_OnConnectBroken.Empty())
             {
                 m_Wrapper->m_OnConnectBroken(m_Wrapper, m_Wrapper->m_IStream, m_Wrapper->m_OStream);
             }
         }
     }
     else
     {
         AsyncReceive();
         m_Wrapper->m_OnReceived(m_Wrapper, m_Wrapper->m_IStream, m_Wrapper->m_OStream);
     }
 }
示例#2
0
        void OnSent(StreamBuffer::Node* node, const error_code& error)
        {
            m_RequestSendRequestCount--;
            if (error.value() != 0)
            {
                m_Wrapper->m_OStream.DeallocNode(node);
                if (m_PendingRecvRequestCount == 0 && m_RequestSendRequestCount == 0)
                {
                    if (!(error.value() == 104 || error.value() == 54))
                    {
                        m_Wrapper->Close(); 
                    }
                    if (!m_Wrapper->m_OnConnectBroken.Empty())
                    {
                        m_Wrapper->m_OnConnectBroken(m_Wrapper, m_Wrapper->m_IStream, m_Wrapper->m_OStream);
                    }
                }
            } 
            else 
            {
                if (!m_Wrapper->m_OnSent.Empty())
                {
                     m_Wrapper->m_OnSent(m_Wrapper, (const void *)((char *)node + sizeof(StreamBuffer::Node)), node->m_Len);
                }

                m_Wrapper->m_OStream.DeallocNode(node);
                AsyncSend();
            }
        } 
示例#3
0
    void WSThread_tls::runTimer(const error_code & ec, websocketpp::connection_hdl hdl, int timerInd)
    {
        // Все данные в m_connections[hdl]
        if (hdl.expired())
            return;

        if (m_connections[hdl].timing == nullptr)
            return;
        if (!m_connections[hdl].timing->isTimerOn)
            return;

        if (ec.value() !=0 ) {
            ERROR_STREAM_F << " Error code: " << ec.value() << " Mess: " << ec.message();
        }

        try {
            if (forRunTimer(hdl, timerInd))
                return;
            m_connections[hdl].timing->m_timer = m_server.set_timer(m_connections[hdl].timing->msec, bind(&WSThread_tls::runTimer
                , this, placeholders::_1, hdl, timerInd));
        }
        catch (...) {
            // This exception is not thrown out in normal operation
            ERROR_STREAM_F << "RUN EXCEPTION!!!!!!!";
        }
    }
示例#4
0
	bool connection::check_error(const error_code& err)
	{
		if (!err)
		{
			return true;
		}

		switch (err.value())
		{
		case asio::error::operation_aborted:
			break;

		case custom_error::no_such_file_or_directory:
			closed(shared_from_this());
			break;

		case custom_error::ssl_short_read:
			closed(shared_from_this());
			break;

		default:
			error(shared_from_this(), err.value(), err.message());
			break;
		}

		return false;
	}
示例#5
0
	void client::connected_handler(client_session *session, std::shared_ptr<connection> conn, const error_code& err)
	{
		if (err)
		{
			switch (err.value())
			{
			case asio::error::connection_refused:
				refused();
				break;

			default:
				error(err.value(), err.message());
				break;

			}

			return;
		}

		_connection = conn;

		_session = std::shared_ptr<client_session>(session);

		auto closed_slot = [this](std::shared_ptr<connection> conn)
		{
			(void)conn;

			disconnected();
		};

		auto error_slot = [this](std::shared_ptr<connection> conn, int code, const std::string& message)
		{
			(void)conn;

			error(code, message);
		};

		auto received_slot = [this](std::shared_ptr<connection> conn, std::unique_ptr<istream> stream)
		{
			(void)conn;

			received(std::move(stream));
		};

		_connection->closed.connect(closed_slot);
		_connection->error.connect(error_slot);
		_connection->received.connect(received_slot);

		connected();
	}
示例#6
0
lsd::lsd(io_service& ios, address const& listen_interface
	, peer_callback_t const& cb)
	: m_callback(cb)
	, m_socket(udp::endpoint(address_v4::from_string("239.192.152.143", ec), 6771)
		, boost::bind(&lsd::on_announce, self(), _1, _2, _3))
	, m_broadcast_timer(ios)
	, m_retry_count(1)
	, m_cookie(random())
	, m_disabled(false)
{
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
	m_log = fopen("lsd.log", "w+");
	if (m_log == NULL)
	{
		fprintf(stderr, "failed to open 'lsd.log': (%d) %s"
			, errno, strerror(errno));
	}
#endif

	error_code ec;
	m_socket.open(ios, ec);

#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
	if (ec)
	{
		if (m_log) fprintf(m_log, "FAILED TO OPEN SOCKET: (%d) %s\n"
			, ec.value(), ec.message().c_str());
	}
#endif
}
示例#7
0
 bool
 equivalent (error_code const& code, int condition
     ) const noexcept override
 {
     return *this == code.category() &&
         code.value() == condition;
 }
示例#8
0
	void socks_connection::on_handshake1(error_code const& ec, size_t bytes_transferred)
	{
		if (ec || bytes_transferred != 2)
		{
			printf("socks_connection::on_handshake1: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		if (m_out_buffer[0] != 4 && m_out_buffer[0] != 5)
		{
			printf("socks_connection::on_handshake1: unexpected socks protocol version: %d"
				, int(m_out_buffer[0]));
			close_connection();
			return;
		}

		int num_methods = unsigned(m_out_buffer[1]);

		// read list of auth-methods
		asio::async_read(m_client_connection, asio::mutable_buffers_1(&m_out_buffer[0],
				num_methods)
			, std::bind(&socks_connection::on_handshake2, shared_from_this()
				, _1, _2));
	}
示例#9
0
	void socks_connection::on_request_domain_name(error_code const& ec, size_t bytes_transferred)
	{
		if (ec)
		{
			printf("socks_connection::on_request_domain_name(%s): (%d) %s\n"
				, command(), ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		const int buffer_size = 10 + bytes_transferred;

		boost::uint16_t port = m_out_buffer[buffer_size - 2] & 0xff;
		port <<= 8;
		port |= m_out_buffer[buffer_size - 1] & 0xff;

		std::string hostname(&m_out_buffer[5], boost::uint8_t(m_out_buffer[4]));
		printf("socks_connection::on_request_domain_name(%s): hostname: %s port: %d\n"
			, command(), hostname.c_str(), port);

		char port_str[10];
		snprintf(port_str, sizeof(port_str), "%d", port);
		asio::ip::tcp::resolver::query q(hostname, port_str);
		m_resolver.async_resolve(q
			, std::bind(&socks_connection::on_request_domain_lookup
				, shared_from_this(), _1, _2));
	}
示例#10
0
void
Endpoint::raw_recv_callback(const error_code& e, size_t b)
{
    recv_guard.unlock();
    
    if (!e && b > 0) {
        size_t n = inbound.producer().commit_buffer(b),
               u = protocol->buffer2message(inbound.consumer().data(), n);
        
        n = inbound.consumer().consume_buffer(u);
        protocol->handle_messages(dispatcher);
        
        /*
         * Re-register any further reads and update running statistics
         */
        protocol->receive_data();
        recv_rate.update(b);
    } else {
        if (e == boost::asio::error::operation_aborted)
            return;
        
        stop();
    
        if (e != boost::asio::error::eof)
            throw ReadError("Endpoint::raw_recv_callback",
                            e.value(),
                            e.message().c_str());
    }
}
示例#11
0
void
Endpoint::raw_send_callback(const error_code& e, size_t b)
{
    send_guard.unlock();
    
    if (!e && b > 0) {
        size_t n = 0;
       
        n = outbound.consumer().consume_buffer(b);
        protocol->bytes_transferred(b);

        /*
         * Re-register any further writes and update running statistics
         */
        protocol->transfer_data(n); 
        send_rate.update(b);
    } else {
        if (e == boost::asio::error::operation_aborted)
            return;
        
        stop();
        
        if (e != boost::asio::error::eof)
            throw WriteError("Endpoint::raw_send_callback",
                             e.value(),
                             e.message().c_str());
    }
}
    void on_error(error_code const& code)
    {
        if (code)
        {
            if  // usually, by on_receive
               ((code.category() == error::misc_category    && code.value   () == error::eof)               ||

                // and these - by on_send
                (code.category() == error::system_category  && code.value   () == error::connection_reset)  ||
                (code.category() == error::system_category  && code.value   () == error::broken_pipe     ))
            {
                on_discon_(code);
            }
            else
                on_error_(code);
        }
    }
void Session::_AsyncError(const string& message, const error_code& ec)
{
	//komunikat o bledzie operacji asynchronicznej
	string s = message
		+ to_string(ec.value()) + ". "
		+ ec.message() + ". ";
	//wyswietlenie i zamkniecie sesji
	_WasError(s);
}
示例#14
0
void NetClient::OnConnectionFailed(NetConnection* sender, const error_code& error)
{
	LSL_LOG("NetClient conection failed " + error.message());

	if (!_net->OnConnectionFailed(sender, error.value()))
		return;

	Disconnect();
}
示例#15
0
QString StaticHelpers::translateError(error_code const& ec, char* msgs[], int msgs_len)
{
	int code = ec.value();

	if (code < 0 || code >= msgs_len)
	{
		return QString::fromStdString(ec.message());
	}

	return qApp->translate("ErrorMsg", msgs[code]);
}
示例#16
0
	void http_server::on_read(error_code const& ec, size_t bytes_transferred) try
	{
		if (ec)
		{
			std::printf("http_server::on_read: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		m_bytes_used += int(bytes_transferred);

		int const req_len = find_request_len(m_recv_buffer.data(), m_bytes_used);
		if (req_len < 0)
		{
			read();
			return;
		}

		http_request req = parse_request(m_recv_buffer.data(), req_len);

		m_recv_buffer.erase(m_recv_buffer.begin(), m_recv_buffer.begin() + req_len);
		m_bytes_used -= req_len;

		auto it = m_handlers.find(req.path);
		if (it == m_handlers.end())
		{
			if (m_stall_handlers.find(req.path) != m_stall_handlers.end())
			{
				return;
			}
			// no handler found, 404
			m_send_buffer = send_response(404, "Not Found");
		}
		else
		{
			m_send_buffer = it->second(req.method, req.req, req.headers);
		}

		bool close = lower_case(req.headers["connection"]) == "close";

		async_write(m_connection, asio::const_buffers_1(m_send_buffer.data()
			, m_send_buffer.size()), std::bind(&http_server::on_write
			, this, _1, _2, close));
	}
	catch (std::exception& e)
	{
		std::printf("http_server::on_read() failed: %s\n"
			, e.what());
		close_connection();
	}
示例#17
0
	void socks_connection::on_handshake3(error_code const& ec, size_t bytes_transferred)
	{
		if (ec || bytes_transferred != 2)
		{
			printf("socks_connection::on_handshake3: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		asio::async_read(m_client_connection, asio::mutable_buffers_1(&m_out_buffer[0], 10)
			, std::bind(&socks_connection::on_request1, shared_from_this()
				, _1, _2));
	}
示例#18
0
 __dir_stream(const path& root, directory_options opts, error_code& ec)
     : __stream_(nullptr),
       __root_(root)
 {
     if ((__stream_ = ::opendir(root.c_str())) == nullptr) {
         ec = detail::capture_errno();
         const bool allow_eacess =
             bool(opts & directory_options::skip_permission_denied);
         if (allow_eacess && ec.value() == EACCES)
             ec.clear();
         return;
     }
     advance(ec);
 }
示例#19
0
文件: socket.cpp 项目: uvbs/XDLL
void UDPSocket::OnReceive( const error_code& error, std::size_t bytes, UDPReceiveSessionPtr session )
{
	if (!error || error == boost::asio::error::message_size)
	{
		assert( bytes > 0 );
		// ³É¹¦
		InetSocketAddress addr = from_endpoint( session->remote_endpoint );
		this->GetListener()->OnSocketReceive(this, addr, session->buffer.data(), bytes );
	}
	else
	{
		// ʧ°Ü
		this->GetListener()->OnSocketReceiveFailed( this, error.value() );
	}
}
示例#20
0
int error_decoder(error_code const& ec )
{
    const native_to_socket_err_t* cur = native_to_socket_err;

    do
    {
        if ( ec.value() == cur->native )
        {
              return cur->socket_err;
        }
        ++cur;
    } while ( cur != native_to_socket_err + sizeof( native_to_socket_err ) / sizeof( native_to_socket_err_t ) );
    
    return -1;
}
示例#21
0
	void http_proxy::on_server_forward(error_code const& ec
		, size_t /* bytes_transferred */)
	{
		if (ec)
		{
			std::printf("http_proxy: error writing to client: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		m_server_connection.async_read_some(
			sim::asio::mutable_buffers_1(m_in_buffer, sizeof(m_in_buffer))
			, std::bind(&http_proxy::on_server_receive, this, _1, _2));
	}
示例#22
0
	void http_server::on_accept(error_code const& ec)
	{
		if (ec)
		{
			std::printf("http_server::on_accept: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		std::printf("http_server accepted connection from: %s : %d\n",
			m_ep.address().to_string().c_str(), m_ep.port());

		read();
	}
示例#23
0
文件: socket.cpp 项目: uvbs/XDLL
void TCPClientSocket::OnConnect( const error_code& error )
{
	m_ConnectTimer.Stop();
	//if ( this->IsClosed() )
	//{
	//	return;
	//}
	if ( !error )
	{
		this->GetListener()->OnSocketConnect( this );
	}
	else
	{
		this->GetListener()->OnSocketConnectFailed( this, error.value() );
	}
}
示例#24
0
void lsd::announce(sha1_hash const& ih, int listen_port, bool broadcast)
{
	if (m_disabled) return;

	char ih_hex[41];
	to_hex((char const*)&ih[0], 20, ih_hex);
	char msg[200];
	int msg_len = snprintf(msg, sizeof(msg),
		"BT-SEARCH * HTTP/1.1\r\n"
		"Host: 239.192.152.143:6771\r\n"
		"Port: %d\r\n"
		"Infohash: %s\r\n"
		"cookie: %x\r\n"
		"\r\n\r\n", listen_port, ih_hex, m_cookie);

#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
	{
		if (m_log) fprintf(m_log, "%s ==> announce: ih: %s port: %u\n"
			, time_now_string(), ih_hex, listen_port);
	}
#endif

	m_retry_count = 1;
	error_code ec;
	m_socket.send(msg, msg_len, ec, broadcast ? broadcast_socket::broadcast : 0);
	if (ec)
	{
		m_disabled = true;
#if defined(TORRENT_LOGGING) || defined(TORRENT_VERBOSE_LOGGING)
		{
			if (m_log) fprintf(m_log, "%s failed to send message: (%d) %s"
				, time_now_string(), ec.value(), ec.message().c_str());
		}
#endif

		return;
	}

#if defined TORRENT_ASIO_DEBUGGING
	add_outstanding_async("lsd::resend_announce");
#endif
	m_broadcast_timer.expires_from_now(seconds(2 * m_retry_count), ec);
	m_broadcast_timer.async_wait(boost::bind(&lsd::resend_announce, self(), _1
		, std::string(msg)));
}
示例#25
0
	void http_proxy::on_server_write(error_code const& ec, size_t bytes_transferred)
	{
		m_writing_to_server = false;
		if (ec)
		{
			std::printf("http_proxy::on_server_write: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		memmove(&m_server_out_buffer[0], m_server_out_buffer + bytes_transferred
			, m_num_server_out_bytes - bytes_transferred);
		m_num_server_out_bytes -= int(bytes_transferred);

		if (m_num_server_out_bytes > 0)
			write_server_send_buffer();
	}
示例#26
0
QString StaticHelpers::translateUpnpError(error_code const& ec)
{
	int ev = ec.value();
	int num_errors = sizeof(error_codes) / sizeof(error_codes[0]);
	error_code_t* end = error_codes + num_errors;
	error_code_t tmp = { ev, 0 };
	error_code_t* e = std::lower_bound(error_codes, end, tmp
	                                   , boost::bind(&error_code_t::code, _1) < boost::bind(&error_code_t::code, _2));

	if (e != end && e->code == ev)
	{
		return e->msg;
	}

	char msg[500];
	snprintf(msg, sizeof(msg), "unknown UPnP error (%d)", ev);
	return msg;
}
示例#27
0
	void http_proxy::on_read_request(error_code const& ec, size_t bytes_transferred) try
	{
		if (ec)
		{
			std::printf("http_proxy::on_read_request: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		m_num_client_in_bytes += int(bytes_transferred);

		// scan for end of HTTP request
		int req_len = find_request_len(m_client_in_buffer, m_num_client_in_bytes);
		while (req_len >= 0)
		{
			// parse request from [0, eor), connect to target server and forward
			// the request.
			http_request const req = parse_request(m_client_in_buffer, req_len);
			forward_request(req);

			// pop this request from the receive buffer
			memmove(m_client_in_buffer + req_len, m_client_in_buffer
				, m_num_client_in_bytes - req_len);
			m_num_client_in_bytes -= req_len;

			// is there another request in the buffer?
			req_len = find_request_len(m_client_in_buffer, m_num_client_in_bytes);
		}

		// read more from the client
		m_client_connection.async_read_some(asio::mutable_buffers_1(
			&m_client_in_buffer[m_num_client_in_bytes]
			, sizeof(m_client_in_buffer) - m_num_client_in_bytes)
			, std::bind(&http_proxy::on_read_request, this, _1, _2));
	}
	catch (std::runtime_error& e)
	{
		std::printf("http_proxy::on_read_request() failed: %s\n"
			, e.what());
		close_connection();
	}
示例#28
0
 void OnConnected(const std::string& remote, _UInt16 port, const error_code& error)
 {
     if (error.value() == 0)
     {
         m_Wrapper->m_IStream.Clear();  // Hack by hailong for re-connection
         m_Wrapper->m_OStream.Clear();  
         CloseLinger();
         AsyncReceive();
         m_Wrapper->m_OnConnected(m_Wrapper, m_Wrapper->m_IStream, m_Wrapper->m_OStream);
     }
     else 
     {
         m_Wrapper->m_Errno = IGAME_ERROR_CONNECT;
         m_Socket.close();
         if (!m_Wrapper->m_OnConnectFailed.Empty())
         {
             m_Wrapper->m_OnConnectFailed(m_Wrapper, m_Wrapper->m_IStream, m_Wrapper->m_OStream);
         }
     }
 }
示例#29
0
	void http_proxy::on_accept(error_code const& ec)
	{
		if (ec == asio::error::operation_aborted)
			return;

		if (ec)
		{
			std::printf("http_proxy::on_accept: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		std::printf("http_proxy accepted connection from: %s : %d\n",
			m_ep.address().to_string().c_str(), m_ep.port());

		// read http request
		m_client_connection.async_read_some(asio::mutable_buffers_1(
			&m_client_in_buffer[0], sizeof(m_client_in_buffer))
			, std::bind(&http_proxy::on_read_request, this, _1, _2));
	}
示例#30
0
	void http_server::on_write(error_code const& ec
		, size_t /* bytes_transferred */
		, bool close)
	{
		if (ec)
		{
			std::printf("http_server::on_write: (%d) %s\n"
				, ec.value(), ec.message().c_str());
			close_connection();
			return;
		}

		if (!close && (m_flags & keep_alive))
		{
			// try to read another request out of the buffer
			m_ios.post(std::bind(&http_server::on_read, this, error_code(), 0));
		}
		else
		{
			close_connection();
		}
	}