/// <summary> /// Sends a file that is larger than the size specified in InputshareLib.Settings.NetworkMessageChunkSize /// </summary> /// <param name="message"></param> private void SendLargeMessage(NetworkMessage message) { Task.Run(() => { byte[] data = message.ToBytes(); Guid transferId = Guid.NewGuid(); int hPos = 0; int hRem = data.Length; do { int partLen = Settings.NetworkMessageChunkSizeNoHeader; if (hRem - partLen < 0) { partLen = hRem; } byte[] part = new byte[partLen]; Buffer.BlockCopy(data, hPos, part, 0, partLen); MessageChunkMessage chunk = new MessageChunkMessage(transferId, part, data.Length); SendMessage(chunk); hPos += partLen; hRem -= partLen; } while (hRem > 0); }); }
/// <summary> /// Called when the socket receives a message chunk, and stores /// it in the appropriate LargeMessageHandler based on the message GUID /// </summary> /// <param name="message"></param> private void HandleMessageChunkReceived(MessageChunkMessage message) { LargeMessageHandler handler = GetMessageHandlerFromId(message.MessageId); if (handler == null) { //ISLogger.Write("Incoming large packet (" + message.MessageSize / 1024 + "KB)"); handler = new LargeMessageHandler(message.MessageId, message.MessageSize); messageHandlers.Add(handler); } handler.Write(message.MessageData); if (handler.FullyReceived) { byte[] data = handler.ReadAndClose(); messageHandlers.Remove(handler); HandleReceivedMessage(message.MessageSize, data); } }