Example #1
0
        private async Task <TcpListenerStatus> StartTcpListener()
        {
            var status = new TcpListenerStatus();

            try
            {
                var host = new Uri(Configuration.Core.ServerUrl).DnsSafeHost;
                var port = 9090;
                if (string.IsNullOrWhiteSpace(Configuration.Core.TcpServerUrl) == false)
                {
                    var uri = new Uri(Configuration.Core.TcpServerUrl);
                    host = uri.DnsSafeHost;
                    if (uri.IsDefaultPort == false)
                    {
                        port = uri.Port;
                    }
                }

                foreach (var ipAddress in await GetTcpListenAddresses(host))
                {
                    if (_logger.IsInfoEnabled)
                    {
                        _logger.Info($"RavenDB TCP is configured to use {Configuration.Core.TcpServerUrl} and bind to {ipAddress} at {port}");
                    }

                    var listener = new TcpListener(ipAddress, port);
                    status.Listeners.Add(listener);
                    status.Port = port;
                    listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                    listener.Start();
                    for (int i = 0; i < 4; i++)
                    {
                        ListenToNewTcpConnection(listener);
                    }
                }
                return(status);
            }
            catch (Exception e)
            {
                foreach (var tcpListener in status.Listeners)
                {
                    tcpListener.Stop();
                }
                if (_tcpLogger.IsOperationsEnabled)
                {
                    _tcpLogger.Operations(
                        $"Failed to start tcp server on {Configuration.Core.TcpServerUrl}, tcp listening disabled", e);
                }
                throw;
            }
        }
Example #2
0
        private TcpListenerStatus StartTcpListener()
        {
            string host   = "<unknown>";
            var    port   = 0;
            var    status = new TcpListenerStatus();

            try
            {
                host = new Uri(Configuration.Core.ServerUrl).DnsSafeHost;
                if (string.IsNullOrWhiteSpace(Configuration.Core.TcpServerUrl) == false)
                {
                    if (ushort.TryParse(Configuration.Core.TcpServerUrl, out ushort shortPort))
                    {
                        port = shortPort;
                    }
                    else
                    {
                        var uri = new Uri(Configuration.Core.TcpServerUrl);
                        host = uri.DnsSafeHost;
                        if (uri.IsDefaultPort == false)
                        {
                            port = uri.Port;
                        }
                    }
                }
                bool successfullyBoundToAtLeastOne = false;
                var  errors = new List <Exception>();
                foreach (var ipAddress in GetListenIpAddresses(host))
                {
                    if (Logger.IsInfoEnabled)
                    {
                        Logger.Info($"RavenDB TCP is configured to use {Configuration.Core.TcpServerUrl} and bind to {ipAddress} at {port}");
                    }

                    var listener = new TcpListener(ipAddress, port);
                    status.Listeners.Add(listener);
                    listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                    try
                    {
                        listener.Start();
                    }
                    catch (Exception ex)
                    {
                        var msg = "Unable to start tcp listener on " + ipAddress + " on port " + port;
                        errors.Add(new IOException(msg, ex));
                        if (Logger.IsOperationsEnabled)
                        {
                            Logger.Operations(msg, ex);
                        }
                        continue;
                    }
                    successfullyBoundToAtLeastOne = true;
                    var listenerLocalEndpoint = (IPEndPoint)listener.LocalEndpoint;
                    status.Port = listenerLocalEndpoint.Port;
                    // when binding to multiple interfaces and the port is 0, use
                    // the same port across all interfaces
                    port = listenerLocalEndpoint.Port;
                    for (int i = 0; i < 4; i++)
                    {
                        ListenToNewTcpConnection(listener);
                    }
                }

                if (successfullyBoundToAtLeastOne == false)
                {
                    if (errors.Count == 1)
                    {
                        throw errors[0];
                    }
                    throw new AggregateException(errors);
                }
                return(status);
            }
            catch (Exception e)
            {
                if (_tcpLogger.IsOperationsEnabled)
                {
                    _tcpLogger.Operations($"Failed to start tcp server on tcp://{host}:{port}, tcp listening disabled", e);
                }

                foreach (var tcpListener in status.Listeners)
                {
                    tcpListener.Stop();
                }

                throw;
            }
        }