Exemplo n.º 1
0
 public RNetMessage(byte[] data, long?transactionId, EndPoint remoteEP, RQoSType qosType = RQoSType.Unrealiable)
 {
     Data           = data;
     TransactionId  = transactionId;
     RemoteEndPoint = remoteEP;
     QoSType        = qosType;
 }
Exemplo n.º 2
0
        /// <summary>
        /// Enqueues message in sending queue, uses own implementation of <see cref="RTransactionGenerator"/> if qosType is reliable.
        /// </summary>
        /// <param name="messageId"></param>
        /// <param name="data"></param>
        /// <param name="remoteEndPoint"></param>
        /// <param name="qosType"></param>
        public void Send(ref byte[] data, IPEndPoint remoteEndPoint, RQoSType qosType = RQoSType.Unrealiable)
        {
            if (data.Length == 0)
            {
                _logger?.WriteError(new LogInfo("Tried to send empty message."));
                return;
            }
            else if (remoteEndPoint == null)
            {
                _logger?.WriteError(new LogInfo("Could not send message to unknown endpoint."));
                return;
            }

            if (!_cts.Token.IsCancellationRequested)
            {
                RNetMessage message;
                switch (qosType)
                {
                default:
                case RQoSType.Realiable:
                case RQoSType.Internal:
                    message = new RNetMessage(data, RTransactionGenerator.GenerateId(), remoteEndPoint, qosType);
                    break;

                case RQoSType.Unrealiable:
                    message = new RNetMessage(data, null, remoteEndPoint, qosType);
                    break;
                }
                _outgoingMsgQueue.Enqueue(message);
            }
        }
Exemplo n.º 3
0
        public RNetMessage?Deserialize(byte[] data, IPEndPoint remoteEndPoint, out EDeserializeError error)
        {
            error = EDeserializeError.None;
            int DataSize = data.Length;

            long?    TransactionId = null;
            RQoSType type          = RQoSType.Realiable;

            int readCursor = 1;//byte[0] = 1 -> RNetMessage

            if (data[readCursor++] == 1)
            {
                TransactionId = BitConverter.ToInt64(data, readCursor);
                readCursor   += sizeof(long);
            } //else TransactionId = null

            if (readCursor > DataSize)
            {
                error = EDeserializeError.NotComplete;
                return(null);
            }

            type = (RQoSType)data[readCursor++];

            if (readCursor > DataSize)
            {
                error = EDeserializeError.NotComplete;
                return(null);
            }

            int data_length = BitConverter.ToInt32(data, readCursor);

            readCursor += sizeof(int);

            if (readCursor + data_length > DataSize)
            {
                error = EDeserializeError.NotComplete;
                return(null);
            }

            byte[] rec_data = new byte[data_length];
            Array.Copy(data, readCursor, rec_data, 0, data_length);

            return(new RNetMessage(rec_data, TransactionId, remoteEndPoint, type));
        }