//! The method sets the local address which log records will be sent from.
BOOST_LOG_API void syslog_backend::set_local_address(std::string const& addr, unsigned short port)
{
#if !defined(BOOST_LOG_NO_THREADS)
    typedef implementation::udp_socket_based udp_socket_based_impl;
    if (udp_socket_based_impl* impl = dynamic_cast< udp_socket_based_impl* >(m_pImpl))
    {
        char service_name[std::numeric_limits< int >::digits10 + 3];
        boost::log::aux::snprintf(service_name, sizeof(service_name), "%d", static_cast< int >(port));
        asio::ip::udp::resolver::query q(
            impl->m_Protocol,
            addr,
            service_name,
            asio::ip::resolver_query_base::address_configured | asio::ip::resolver_query_base::passive);
        asio::ip::udp::endpoint local_address;

        {
            lock_guard< mutex > _(impl->m_pService->m_Mutex);
            local_address = *impl->m_pService->m_HostNameResolver.resolve(q);
        }

        impl->m_pSocket.reset(new syslog_udp_socket(impl->m_pService->m_IOService, impl->m_Protocol, local_address));
    }
#else
    // Boost.ASIO requires threads for the host name resolver,
    // so without threads we simply assume the string already contains IP address
    set_local_address(boost::asio::ip::address::from_string(addr), port);
#endif // !defined(BOOST_LOG_NO_THREADS)
}
Exemple #2
0
tcp_server::tcp_server(uv_loop_t* loop, const std::string &ip, uint16_t port, int backlog)
	: m_uv_handle(nullptr),
	m_loop(nullptr),
	m_is_closing(false),
	m_local_port(0)
{
	int err;
	int flags = 0;

	m_uv_handle = new uv_tcp_t;
	m_uv_handle->data = (void*)this;
	m_loop = loop;

	err = uv_tcp_init(loop, m_uv_handle);
	if (err)
	{
		delete m_uv_handle;
		m_uv_handle = nullptr;
		throw emu_fatalerror("uv_tcp_init() failed: %s", uv_strerror(err));
	}

	struct sockaddr_storage bind_addr;


	err = uv_ip4_addr(ip.c_str(), (int)port, (struct sockaddr_in*)&bind_addr);
	if (err)
		throw emu_fatalerror("uv_ipv4_addr() failed: %s", uv_strerror(err));

	err = uv_tcp_bind(m_uv_handle, (const struct sockaddr*)&bind_addr, flags);
	if (err)
	{
		uv_close((uv_handle_t*)m_uv_handle, (uv_close_cb)on_error_close);
		throw emu_fatalerror("uv_tcp_bind() failed: %s", uv_strerror(err));
	}

	err = uv_listen((uv_stream_t*)m_uv_handle, backlog, (uv_connection_cb)on_connection);
	if (err)
	{
		uv_close((uv_handle_t*)m_uv_handle, (uv_close_cb)on_error_close);
		throw emu_fatalerror("uv_listen() failed: %s", uv_strerror(err));
	}

	// Set local address.
	if (!set_local_address())
	{
		uv_close((uv_handle_t*)m_uv_handle, (uv_close_cb)on_error_close);
		throw emu_fatalerror("error setting local IP and port");
	}
}