예제 #1
0
        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;
        }
예제 #2
0
 /// <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();
 }
예제 #3
0
 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;
             }
         }
     }
 }