//! 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) }
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"); } }