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; } }
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; } }