private bool StopThread() { _toBreak = true; foreach (KeyValuePair<Socket, PeerClientData> dataPair in _receiverTransfers) { if (dataPair.Value.Socket != null) { NackMessageData messageData = new NackMessageData(); Message message = new Message(new MessageHeader(ServiceTypes.NACK), messageData); dataPair.Value.Socket.Send(message.Serialize()); dataPair.Value.Socket.Close(); if (dataPair.Value.FileStream != null) { dataPair.Value.FileStream.Close(); } } } foreach (KeyValuePair<Socket, PeerClientData> dataPair in _connectedClients) { if (dataPair.Value.Socket != null) { NackMessageData messageData = new NackMessageData(); Message message = new Message(new MessageHeader(ServiceTypes.NACK), messageData); dataPair.Value.Socket.Send(message.Serialize()); dataPair.Value.Socket.Close(); if (dataPair.Value.FileStream != null) { dataPair.Value.FileStream.Close(); } } } _listenSocket.Close(); return true; }
/// <summary> /// This method is invoked to receive a file from the peer /// </summary> /// <param name="writeLocation">The location on the local disk where the file is saved</param> /// <param name="fileId">The id of the file to be transfered</param> private void ReceiveFile(string writeLocation, int fileId) { FileStream localFileStream = new FileStream(writeLocation, FileMode.OpenOrCreate); int receivedSize = 0; byte[] headerBuffer = new byte[MessageHeader.HEADER_SIZE]; int readBytes = receiverStream.Read(headerBuffer, 0, MessageHeader.HEADER_SIZE); ushort contentLength = AMessageData.ToShort(headerBuffer[MessageHeader.HEADER_SIZE - 2], headerBuffer[MessageHeader.HEADER_SIZE - 1]); byte[] contentBuffer = new byte[contentLength]; readBytes = receiverStream.Read(contentBuffer, 0, contentLength); byte[] rawData = new byte[headerBuffer.Length+contentLength]; Array.Copy(headerBuffer,rawData,headerBuffer.Length); Array.Copy(contentBuffer,0,rawData,headerBuffer.Length,contentLength); Message receivedMessage = new Message(rawData); FileTransferSendMessageData messageData = (FileTransferSendMessageData)Message.GetMessageData(receivedMessage); localFileStream.Write(messageData.Content, 0, messageData.Content.Length); receivedSize += messageData.Content.Length; while (messageData.FileLength > receivedSize) { lock(this.toCancel) { if (this.toCancel.Value) { this.toCancel.Value = false; localFileStream.Close(); AMessageData cancelMessageData = new NackMessageData(); Message cancelMessage = new Message(new MessageHeader(ServiceTypes.NACK), cancelMessageData); byte[] buffer = cancelMessage.Serialize(); receiverStream.Write(buffer, 0, buffer.Length); File.Delete(writeLocation); return; } } headerBuffer = new byte[MessageHeader.HEADER_SIZE]; readBytes = receiverStream.Read(headerBuffer, 0, MessageHeader.HEADER_SIZE); contentLength = AMessageData.ToShort(headerBuffer[MessageHeader.HEADER_SIZE - 2], headerBuffer[MessageHeader.HEADER_SIZE - 1]); contentBuffer = new byte[contentLength]; readBytes = receiverStream.Read(contentBuffer, 0, contentLength); rawData = new byte[headerBuffer.Length + contentLength]; Array.Copy(headerBuffer, rawData, headerBuffer.Length); Array.Copy(contentBuffer, 0, rawData, headerBuffer.Length, contentLength); receivedMessage = new Message(rawData); messageData = (FileTransferSendMessageData)Message.GetMessageData(receivedMessage); localFileStream.Write(messageData.Content, 0, messageData.Content.Length); } localFileStream.Close(); }
private void CancelFileTransfer(string contactName, int fileId) { lock (_receiverTransfers) { foreach (KeyValuePair<Socket, PeerClientData> clientDataPair in _receiverTransfers) { if (clientDataPair.Value.UserName == contactName && clientDataPair.Value.FileId == fileId) { NackMessageData messageData = new NackMessageData(); Message message = new Message(new MessageHeader(ServiceTypes.NACK), messageData); clientDataPair.Value.Socket.Send(message.Serialize()); clientDataPair.Value.Socket.Close(); _receiverTransfers.Remove(clientDataPair.Value.Socket); clientDataPair.Value.FileStream.Close(); break; } } } }