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