protected bool Send( int connectionId, byte[] key, InternalMessage message, ChannelIndex channel, BitWriter writer, bool sendImmediately, out string error ) { MessageSecurity security = AlpacaConstant.GetSecurity( channel ); if( !WrapMessage( message, security, writer, key, out error ) ) { return false; } //_profiler.StartEvent(TickType.Send, (uint)stream.Length, channelName, AlpacaConstant.INTERNAL_MESSAGE_NAME[messageType]); DataStream s = writer.GetStream(); byte errorAsByte; if( sendImmediately ) { NetworkTransport.Send ( 0, connectionId, channel.GetIndex(), s.GetBuffer(), s.GetByteLength(), out errorAsByte); } else { NetworkTransport.QueueMessageForSending( 0, connectionId, channel.GetIndex(), s.GetBuffer(), s.GetByteLength(), out errorAsByte); } //_profiler.EndEvent(); if( (NetworkError)errorAsByte != NetworkError.Ok ) { error = $"Send {AlpacaConstant.GetName(message)} to node {connectionId} failed with error{StringFromError(errorAsByte)}"; return false; } return true; }
void HandleMessage( BitReader reader, ChannelIndex channel ) { InternalMessage messageType = UnwrapMessage( reader, NodeIndex.SERVER_NODE_INDEX ); if( messageType == InternalMessage.INVALID ) { return; } //_profiler.StartEvent(TickType.Receive, size, channelId, messageType); Log.Info( $"Handling message {AlpacaConstant.GetName(messageType)} from server" ); if( (_status == Status.WaitingForChallenge) && (messageType != InternalMessage.ConnectionChallenge) ) { Log.Error( $"We are waiting for challenge, but server sent message {AlpacaConstant.GetName(messageType)} instead." ); return; } if( (_status == Status.WaitingForConnectionApproval) && (messageType != InternalMessage.ConnectionApproved ) ) { Log.Error( $"We are waiting for connection approval, but server sent message {AlpacaConstant.GetName(messageType)} instead." ); return; } switch( messageType ) { case InternalMessage.ConnectionChallenge: // TODO: cozeroff crypto implementation Log.Error( "Crypto not implemented yet!" ); break; case InternalMessage.ConnectionApproved: OnMessageConnectionApproved( reader ); break; // TODO: cozeroff handle sibling connect/disconnect case InternalMessage.EntityCreate: OnEntityCreate( reader ); break; case InternalMessage.CustomClient: OnMessageCustomClient( reader ); break; default: Log.Error( $"Read unrecognized messageType{AlpacaConstant.GetName(messageType)}" ); break; } //_profiler.EndEvent(); }
void HandleMessage( BitReader reader, NodeIndex client, ChannelIndex channel ) { InternalMessage messageType = UnwrapMessage( reader, client ); if( messageType == InternalMessage.INVALID ) { return; } //_profiler.StartEvent(TickType.Receive, size, channelId, messageType); Log.Info( $"Handling message {AlpacaConstant.GetName(messageType)} from client {client.GetClientIndex()}" ); ClientConnection connection = _connection.GetAt( client.GetClientIndex() - 1 ); ClientConnection.Status state = connection.GetState(); if( (state == ClientConnection.Status.PendingConnectionChallengeResponse) && (messageType != InternalMessage.ConnectionResponse ) ) { Log.Error( $"Client {client.GetClientIndex()} is pending connection response, but client sent message {AlpacaConstant.GetName(messageType)} instead." ); return; } if( (state == ClientConnection.Status.PendingConnectionRequest) && (messageType != InternalMessage.ConnectionRequest) ) { Log.Error( $"Client {client.GetClientIndex()} is pending connection request, but client sent message {AlpacaConstant.GetName(messageType)} instead." ); return; } switch( messageType ) { case InternalMessage.ConnectionRequest: OnMessageConnectionRequest( client, reader ); break; case InternalMessage.ConnectionResponse: // TODO: cozeroff crypto implementation Log.Error( "Crypto not implemented yet!" ); break; case InternalMessage.CustomServer: OnMessageCustomServer( client, reader ); break; default: Log.Error( $"Read unrecognized messageType{AlpacaConstant.GetName(messageType)}" ); break; } //_profiler.EndEvent(); }