public bool ConnectGateway() { try { internetAccessAdapter = GetAdapterWithInternetAccess(); log.LogInformation("Adapter with Internet Access: " + internetAccessAdapter); TCPClientGateway = new TcpClient(); TCPClientGateway.Client.Connect(ServerEndpoint); UDPListen = true; TCPListen = true; SendMessageUDP(LocalHubInfo.Simplified(), ServerEndpoint); LocalHubInfo.InternalEndpoint = (IPEndPoint)UDPClientGateway.Client.LocalEndPoint; Thread.Sleep(550); SendMessageTCP(LocalHubInfo); Thread keepAlive = new Thread(new ThreadStart(delegate { while (TCPClientGateway.Connected) { Thread.Sleep(5000); SendMessageTCP(new KeepAlive(LocalHubInfo.Id)); } })) { IsBackground = true }; keepAlive.Start(); hub.Publish(new GatewayConnectedEvent()); return(true); } catch (Exception ex) { log.LogError($"Error when connecting to gateway {ServerEndpoint.ToString()}. Will retry again soon...", ex); hub.Publish(new GatewayErrorEvent($"Error when connecting to gateway {ServerEndpoint.ToString()}. Will retry again soon...")); } return(false); }