void OnPaquetReceived(NetMessagePacket netMessage, INetworkInterfaceConnection source) { // Our source has sent us a paquet! // the message comes from our source ? if (source != _connection) { return; } // the message is about our transfer ? (we could have many in parallel) if (netMessage.TransferId != _transferInfo.TransferId) { return; } // the paquet index is valid ? if (netMessage.PacketIndex < 0 || netMessage.PacketIndex >= _paquetStates.Length) { return; } // the paquet is already acknowledged ? if (_paquetStates[netMessage.PacketIndex] == PacketState.Received) { return; } // mark paquet as acknowledged if (_paquetStates[netMessage.PacketIndex] != PacketState.Received) { _paquetStates[netMessage.PacketIndex] = PacketState.Received; _remainingUnreceivedPaquets--; // copy paquet data into _data int startPos = netMessage.Data.Length * netMessage.PacketIndex; int endPos = Mathf.Min(startPos + netMessage.Data.Length, _data.Length); Array.Copy( sourceArray: netMessage.Data, sourceIndex: 0, destinationArray: _data, destinationIndex: startPos, length: endPos - startPos); } // notify our source that the paquet was received NetMessagePacketACK acknowledgeMessage = new NetMessagePacketACK() { TransferId = _transferInfo.TransferId, PacketIndex = netMessage.PacketIndex }; _sessionInterface.SendNetMessage(acknowledgeMessage, source); }
void SendPacket(INetworkInterfaceConnection destination, int packetIndex) { // create message NetMessagePacket netMessage = new NetMessagePacket() { PacketIndex = packetIndex, Data = s_cachedPacketData, TransferId = _transferId }; // copy slice of array into message data int byteIndex = packetIndex * Transfers.PAQUET_BYTE_ARRAY_SIZE; Array.Copy( sourceArray: _data, sourceIndex: byteIndex, destinationArray: netMessage.Data, destinationIndex: 0, length: Mathf.Min(_data.Length - byteIndex, Transfers.PAQUET_BYTE_ARRAY_SIZE)); // send message _sessionInterface.SendNetMessage(netMessage, destination, reliableAndOrdered: false); }