public override void OnReceivePacketFromClient(IPEndPoint endPoint, DataPacket dataPacket) { GamePeer peer = null; try { peer = PeerCollection.Get(endPoint); var offsets = PacketInfo.GetOffsetInfo(dataPacket.Buffer, dataPacket.Offset); foreach (var item in offsets) { try { var messageData = new Payload(dataPacket.Buffer, item.Offset, item.Length); ProcessMessage(endPoint, messageData, dataPacket.DeliveryOptions, peer); } catch (Exception ex) { _logger.Error($"Error processing message: {ex}"); if (peer != null) { _messageSender.Send(new ErrorResponse(ResultCode.MessageProcessingError), peer); } } } } catch (Exception ex) { _logger.Error($"OnReceivePacketFromClient: Error processing package: {ex}"); if (peer != null) { _messageSender.Send(new ErrorResponse(ResultCode.MessageProcessingError), peer); } } }
public override bool OnNewClientConnect(IPEndPoint endPoint) { try { if (!base.OnNewClientConnect(endPoint)) { return(false); } var peer = PeerCollection.Get(endPoint); if (peer == null) { _logger.Error($"GamePeerListener.OnClientDisconnect error: can not find peer for endpoint {endPoint.Address}:{endPoint.Port}"); return(false); } // _logger.Error($"Sending ConnectedEvent to peer {peer.GetPeerId()}"); _messageSender.Send(new ConnectedEvent(), peer); return(true); } catch (Exception e) { _logger.Error($"OnNewClientConnect error: {e}"); return(false); } }
private BaseClient(string playerName, Rooms rooms, PlayerChannels playerChannels, RoomChannels roomChannels) { if (playerName == null) { throw new ArgumentNullException("playerName"); } if (rooms == null) { throw new ArgumentNullException("rooms"); } if (playerChannels == null) { throw new ArgumentNullException("playerChannels"); } if (roomChannels == null) { throw new ArgumentNullException("roomChannels"); } Log = Logs.Create(LogCategory.Network, GetType().Name); _playerName = playerName; _byteBufferPool = new ConcurrentPool <byte[]>(10, () => new byte[1024]); _queuedUnreliableTransmissions = new TransferBuffer <ArraySegment <byte> >(16); _queuedReliableTransmissions = new TransferBuffer <ArraySegment <byte> >(16); _queuedEvents = new List <NetworkEvent>(); _peers = new PeerCollection(this); _channels = new ChannelCollection(_peers.RoutingTable, playerChannels, roomChannels); _connectionNegotiator = new ConnectionNegotiator(this); _router = new PacketRouter(this, _connectionNegotiator); _commsProcessor = new CommsProcessor(this, _peers.RoutingTable, rooms, _channels); _roomsManager = new RoomMembershipManager(this, _connectionNegotiator, rooms); }
public PeerStateManager( ILogger logger, PeerCollection peerCollection, IEnumerable <IPeerStateHandler> peerStateHandlers, IServiceProvider services) { _logger = logger.ForContext <PeerStateManager>(); _peerCollection = peerCollection; _peerStateHandlers = peerStateHandlers; _services = services; }
public GameServerStats GetStats() { var oldestRoom = _roomManager.GetOldestRoom(); var result = new GameServerStats() { RoomCount = _roomManager.GetRoomsCount(), PeerCount = PeerCollection.GetPeerCount(), RoomsPeerCount = _roomManager.GetRoomPeerCount(), OldestRoomCreatedOn = oldestRoom?.GetCreatedOnDateTime() }; result.PeersCountPerPort = new Dictionary <ushort, int>(); foreach (var listener in GetListeners()) { result.PeersCountPerPort.Add(listener.GetListenPort(), PeerCollection.GetPeerCount()); } return(result); }
public PeerFactory(Application application, PeerCollection peerCollection) { this._application = application; this._peerCollection = peerCollection; }
private void ProcessMessage(IPEndPoint endPoint, byte[] buffer, int offset, int length, MmPeer peer) { //probably bad kind of using var operationCode = MessageBase.GetOperationCode(buffer, offset); _logger.Debug($"Message received. Operation code: {operationCode}"); peer = PeerCollection.Get(endPoint); if (peer == null) { _logger.Warning($"GamePeerListener.OnReceivePacketFromClient error: can not find peer for endpoint {endPoint.Address}:{endPoint.Port}"); return; } //listener handles only auth message, others are sent to roomManager switch (operationCode) { case ShamanOperationCode.Connect: _messageSender.Send(new ConnectedEvent(), peer); break; case ShamanOperationCode.Ping: //ping processing break; case ShamanOperationCode.Disconnect: OnClientDisconnect(endPoint, new SimpleDisconnectInfo(ShamanDisconnectReason.PeerLeave)); break; case ShamanOperationCode.Authorization: var authMessage = Serializer.DeserializeAs <AuthorizationRequest>(buffer, offset, length); if (!Config.IsAuthOn) { //if success - send auth success peer.IsAuthorizing = false; peer.IsAuthorized = true; //this sessionID will be got from backend, after we send authToken, which will come in player properties peer.SetSessionId(authMessage.SessionId); _messageSender.Send(new AuthorizationResponse(), peer); } else { //TODO authorizing logic throw new NotImplementedException(); } break; default: if (!peer.IsAuthorized && Config.IsAuthOn) { _messageSender.Send(new AuthorizationResponse() { ResultCode = ResultCode.NotAuthorized }, peer); return; } else { if (!peer.IsAuthorized) { _messageSender.Send(new AuthorizationResponse(), peer); } } switch (operationCode) { case ShamanOperationCode.PingRequest: _messageSender.Send(new PingResponse(), peer); break; case ShamanOperationCode.CreateRoomFromClient: var createRequest = Serializer.DeserializeAs <CreateRoomFromClientRequest>(buffer, offset, length); TaskScheduler.ScheduleOnceOnNow(async() => { var createResult = await _matchMakingGroupsManager.CreateRoom(peer.GetSessionId(), createRequest.MatchMakingProperties); //parse create result and create response var createResponse = new CreateRoomFromClientResponse(GetJoinInfo(createResult)); if (createResult.Result == RoomOperationResult.OK) { _logger.Info($"Room {createResult.RoomId} created"); } _messageSender.Send(createResponse, peer); }); break; case ShamanOperationCode.DirectJoin: var joinRequest = Serializer.DeserializeAs <DirectJoinRequest>(buffer, offset, length); TaskScheduler.ScheduleOnceOnNow(async() => { //join existing room var joinResult = await _roomManager.JoinRoom(joinRequest.RoomId, new Dictionary <Guid, Dictionary <byte, object> > { { peer.GetSessionId(), joinRequest.MatchMakingProperties } }, joinRequest.MatchMakingWeight, joinRequest.MatchMakingWeight); //parse join result and create response var joinResponse = new DirectJoinResponse(GetJoinInfo(joinResult)); if (joinResult.Result == RoomOperationResult.OK) { _logger.Info($"Player direct joined room {joinResult.RoomId}"); } _messageSender.Send(joinResponse, peer); }); break; case ShamanOperationCode.GetRoomList: var request = Serializer.DeserializeAs <GetRoomListRequest>(buffer, offset, length); var rooms = _matchMakingGroupsManager.GetRooms(request.MatchMakingProperties) .Select(r => new RoomInfo(r.Id, r.TotalWeightNeeded, r.CurrentWeight, r.Properties, r.State)) .ToList(); var getRoomsResponse = new GetRoomListResponse(); getRoomsResponse.Rooms = rooms; _messageSender.Send(getRoomsResponse, peer); break; case ShamanOperationCode.EnterMatchMaking: var enterMessage = Serializer.DeserializeAs <EnterMatchMakingRequest>(buffer, offset, length); if (enterMessage == null) { throw new Exception("Can not deserialize EnterMatchMakingRequest. Result is null"); } var properties = enterMessage.MatchMakingProperties; var requiredProperties = _matchMaker.GetRequiredProperties(); foreach (var property in requiredProperties) { if (!properties.ContainsKey(property)) { _logger.Error($"Player {peer.GetPeerId()} tried to enter matchmaking without property {property}"); _messageSender.Send(new EnterMatchMakingResponse(MatchMakingErrorCode.RequiredPlayerPropertyIsNotSet), peer); return; } } //add player _matchMaker.AddPlayer(peer, enterMessage.MatchMakingProperties, enterMessage.MatchMakingWeight); _messageSender.Send(new EnterMatchMakingResponse(), peer); break; case ShamanOperationCode.LeaveMatchMaking: //remove player _matchMaker.RemovePlayer(peer.GetPeerId()); //send response _messageSender.Send(new LeaveMatchMakingResponse(), peer); break; default: _messageSender.Send(new ErrorResponse(ResultCode.UnknownOperation), peer); return; } break; } }
public ClientStateHandler(ILogger logger, PeerCollection peerCollection, IServiceProvider services) { _logger = logger.ForContext <ClientStateHandler>(); _peerCollection = peerCollection; _services = services; }