private void ClientOnMessageReceived(object sender, MxMessageReceiveEventArgs mxMessageEventArgs)
{
if (mxMessageEventArgs.ProtocolID != MxMessage.ReliableProtocol)
{
return;
}
var data = mxMessageEventArgs.Payload;
// Format of a packet is:
// Byte 0 - 3: message ID
// Byte 4 - 5: length
// Byte 6: current index
// Byte 7: total packets
// Remaining bytes are the fragment data
var messageID = BitConverter.ToInt32(data, 0);
var length = BitConverter.ToUInt16(data, 4);
var currentIndex = (int)data[6];
var totalPackets = (int)data[7];
if (!this.m_ActiveReceiveMessages.ContainsKey(messageID))
{
// Add a new entry in the active receive messages dictionary.
this.m_ActiveReceiveMessages.Add(
messageID,
new MxReliabilityReceiveState(messageID, totalPackets));
}
// Check for invalid payload.
if ((length - 1) + DataOffset >= data.Length)
{
var errorMessage =
"The payload data received had an invalid length for the " +
"data that was present. ";
errorMessage += "\r\n";
errorMessage += "\r\n";
errorMessage += "Client Endpoint: " + mxMessageEventArgs.Client.Endpoint + "\r\n";
errorMessage += "Message ID: " + messageID + "\r\n";
errorMessage += "Message Protocol: " + mxMessageEventArgs.ProtocolID + "\r\n";
errorMessage += "Length: " + length + "\r\n";
errorMessage += "Current Index: " + currentIndex + "\r\n";
errorMessage += "Total Packets: " + totalPackets + "\r\n";
errorMessage += "Payload Length: " + data.Length + "\r\n";
errorMessage += "Payload Length minus Offset: " + (data.Length - DataOffset) + "\r\n";
var exception = new InvalidDataException(errorMessage);
exception.Data.Add("Payload", data);
throw exception;
}
// Extract the fragment data.
var fragmentData = new byte[length];
for (var i = 0; i < length; i++)
{
fragmentData[i] = data[i + DataOffset];
}
// Set the fragment data into the received message.
this.m_ActiveReceiveMessages[messageID].SetFragment(currentIndex, new Fragment(fragmentData, FragmentStatus.Received));
// Perform the receive update to fire events and finalize state if we have all the fragments.
this.UpdateReceive();
}