public RNetMessage(byte[] data, long?transactionId, EndPoint remoteEP, RQoSType qosType = RQoSType.Unrealiable) { Data = data; TransactionId = transactionId; RemoteEndPoint = remoteEP; QoSType = qosType; }
/// <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); } }
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)); }