void RunNATPunchLoop()
        {
            WriteLogMessage("OK\n", ConsoleColor.Green);
            IPEndPoint remoteEndpoint = new(IPAddress.Any, conf.NATPunchtroughPort);

            // Stock Data server sends to everyone:
            var serverResponse = new byte[1] {
                1
            };

            byte[] readData;
            bool   isConnectionEstablishment;
            int    pos;
            string connectionID;

            while (true)
            {
                readData = _punchServer.Receive(ref remoteEndpoint);
                pos      = 0;
                try
                {
                    isConnectionEstablishment = readData.ReadBool(ref pos);

                    if (isConnectionEstablishment)
                    {
                        connectionID = readData.ReadString(ref pos);

                        if (_pendingNATPunches.TryGetBySecond(connectionID, out pos))
                        {
                            NATConnections.Add(pos, new IPEndPoint(remoteEndpoint.Address, remoteEndpoint.Port));
                            _pendingNATPunches.Remove(pos);
                            Console.WriteLine("Client Successfully Established Puncher Connection. " + remoteEndpoint.ToString());
                        }
                    }

                    _punchServer.Send(serverResponse, 1, remoteEndpoint);
                }
                catch
                {
                    // ignore, packet got f****d up or something.
                }
            }
        }
Esempio n. 2
0
        private void ConfigureTransport(Assembly asm)
        {
            var transportClass = asm.GetType(conf.TransportClass);

            WriteLogMessage("OK", ConsoleColor.Green);

            WriteLogMessage("\nLoading Transport Methods... ", ConsoleColor.White, true);
            CheckMethods(transportClass);
            WriteLogMessage("OK", ConsoleColor.Green);

            WriteLogMessage("\nInvoking Transport Methods...");

            if (_awakeMethod != null)
            {
                _awakeMethod.Invoke(transport, null);
            }

            if (_startMethod != null)
            {
                _startMethod.Invoke(transport, null);
            }

            WriteLogMessage("\nStarting Transport... ", ConsoleColor.White, true);

            transport.OnServerError = (clientID, error) =>
            {
                WriteLogMessage($"Transport Error, Client: {clientID}, Error: {error}", ConsoleColor.Red);
            };

            transport.OnServerConnected = (clientID) =>
            {
                WriteLogMessage($"Transport Connected, Client: {clientID}", ConsoleColor.Cyan);
                _currentConnections.Add(clientID);
                _relay.ClientConnected(clientID);

                if (conf.EnableNATPunchtroughServer)
                {
                    string natID = Guid.NewGuid().ToString();
                    _pendingNATPunches.Add(clientID, natID);
                    _NATRequestPosition = 0;
                    _NATRequest.WriteByte(ref _NATRequestPosition, (byte)OpCodes.RequestNATConnection);
                    _NATRequest.WriteString(ref _NATRequestPosition, natID);
                    _NATRequest.WriteInt(ref _NATRequestPosition, conf.NATPunchtroughPort);
                    transport.ServerSend(clientID, 0, new ArraySegment <byte>(_NATRequest, 0, _NATRequestPosition));
                }
            };

            _relay = new RelayHandler(transport.GetMaxPacketSize(0));

            transport.OnServerDataReceived = _relay.HandleMessage;
            transport.OnServerDisconnected = (clientID) =>
            {
                _currentConnections.Remove(clientID);
                _relay.HandleDisconnect(clientID);

                if (NATConnections.ContainsKey(clientID))
                {
                    NATConnections.Remove(clientID);
                }

                if (_pendingNATPunches.TryGetByFirst(clientID, out _))
                {
                    _pendingNATPunches.Remove(clientID);
                }
            };

            transport.ServerStart(conf.TransportPort);

            WriteLogMessage("OK", ConsoleColor.Green);
        }