コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
ファイル: MainWindow.xaml.cs プロジェクト: ZackBoe/ccglite
        // 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.";
                }
            }
        }