async void HandleServerInfoRequest(object sender, Request serverInfoRequest) { _eventLog.Add(new ServerEvent { EventType = EventType.ReceivedServerInfoRequest, RemoteServerIpAddress = serverInfoRequest.RemoteServerInfo.SessionIpAddress, RemoteServerPortNumber = serverInfoRequest.RemoteServerInfo.PortNumber }); EventOccurred?.Invoke(this, _eventLog.Last()); var serverInfoResponse = new ServerInfoResponse { LocalServerInfo = MyInfo, RemoteServerInfo = serverInfoRequest.RemoteServerInfo, LocalIpAddress = MyInfo.LocalIpAddress, PublicIpAddress = MyInfo.PublicIpAddress, PortNumber = MyInfo.PortNumber, Platform = MyInfo.Platform, TransferFolderPath = MyInfo.TransferFolder, Status = RequestStatus.InProgress, Direction = TransferDirection.Outbound }; var sendRequest = await _requestHandler.SendRequestAsync(serverInfoResponse); if (sendRequest.Failure) { ReportError(this, sendRequest.Error); return; } SuccessfullyProcessedRequest?.Invoke(this, serverInfoResponse); }
private void PingServer(object sender, ElapsedEventArgs e) { // Check server reachable try { bool wasReachable = IsAvailable; serverInfo = rpc.ServerInfo(new ServerInfoRequest(), new CallOptions(deadline: DateTime.UtcNow.AddSeconds(10))); isReachable = true; // Start listening stream if it failed if (!wasReachable && IsAvailable) { Log.Info("Region server reinitialized after being unreachable"); } } catch (Exception ex) { isReachable = false; Log.Error("Ping RegionServer failed", ex); } }
void HandleServerInfoResponse(object sender, ServerInfoResponse serverInfoResponse) { serverInfoResponse.RemoteServerInfo.DetermineSessionIpAddress(Settings.LocalNetworkCidrIp); _eventLog.Add(new ServerEvent { EventType = EventType.ReceivedServerInfo, RemoteServerIpAddress = serverInfoResponse.RemoteServerInfo.SessionIpAddress, RemoteServerPortNumber = serverInfoResponse.RemoteServerInfo.PortNumber, RemoteServerPlatform = serverInfoResponse.RemoteServerInfo.Platform, RemoteFolder = serverInfoResponse.RemoteServerInfo.TransferFolder, LocalIpAddress = serverInfoResponse.RemoteServerInfo.LocalIpAddress, PublicIpAddress = serverInfoResponse.RemoteServerInfo.PublicIpAddress }); EventOccurred?.Invoke(this, _eventLog.Last()); SuccessfullyProcessedRequest?.Invoke(this, serverInfoResponse); }
protected async Task Init() { // Get Info serverInfo = await rpc.ServerInfoAsync(new ServerInfoRequest()); // TCP relay tcpRelaySocket.OnPacketReceived += (buf, len) => { OnPacketReceived?.Invoke(buf, len); }; tcpRelaySocket.Init(); // Periodically restart listeners & reconnect PingTimer = new Timer(); PingTimer.Interval = 15000; PingTimer.Elapsed += PingServer; PingTimer.Start(); // Sync clients periodically Task.Run(SyncTask); }
// MouseUp action on a server row private void ServerGrid_Click(object sender, EventArgs e) { Server server = (Server)ServerGrid.SelectedItem; // Don't want to try to query the fake servers CCG uses as group headings if (!server.Name.StartsWith("---")) { int port = Convert.ToInt32(server.SPort); // Arma2 servers respond to Source server queries SourceServerQuery query = new SourceServerQuery(server.IP, port); ServerInfoResponse sr = query.GetServerInformation(); PlayersResponse pr = query.GetPlayerList(); // Slide out details pane serverDetails.IsOpen = true; // If the server responds with a name, let's go // Actually I don't think this works - the source query lib returns "N/A (Timed out)" instead of null if (sr.name != null) { // Populate the details pane with, ya know, details serverDetails.Header = server.Name; fly_serverName.Content = stripUni(sr.name); fly_serverName.ToolTip = stripUni(sr.name); fly_serverPlayers.Content = "Players: " + sr.players.ToString() + "/" + sr.maxplayers.ToString(); fly_serverIP.Content = server.FullIP; fly_serverVer.Content = "v" + stripUni(sr.version); fly_serverGame.Content = "Gamemode: " + stripUni(sr.game); if (server.Mods != "") { fly_serverMods.Content = "Mods: " + server.Mods; fly_serverMods.ToolTip = server.Mods; } else { fly_serverMods.Visibility = System.Windows.Visibility.Hidden; } // Don't need to show a player list for an empty server if (sr.players > 0) { // Modified SourceQuery Library for larger buffer size. // Previously returned null (SocketException) for >~ 51 players try { fly_playerList.Items.Clear(); fly_playerList.Visibility = System.Windows.Visibility.Visible; foreach (var player in pr.players) { fly_playerList.Items.Add(stripUni(player.name)); } } catch (NullReferenceException ex) { fly_serverPlayers.Content += " (Error Reading Players)"; fly_playerList.Visibility = System.Windows.Visibility.Hidden; } } else { fly_playerList.Visibility = System.Windows.Visibility.Hidden; } } // Again, this probably won't work because query doesn't return null if server doesn't respond else { fly_serverName.Content = "Error querying server, possibly offline."; } } }