Esempio n. 1
0
        public TcpTransferNotifier StartSendingFile(string path)
        {
            if (path == null)
            {
                throw new ArgumentNullException("path");
            }
            if (!File.Exists(path))
            {
                throw new ArgumentException("파일을 전송하는데 지정된 경로가 존재하지 않습니다.");
            }

            if (mFileSending)
            {
                throw new InvalidOperationException("파일이 이미 전송중인 중에 또다른 파일 전송을 요청하였습니다.");
            }

            mFileSending = true;

            FileInfo    fileInfo    = new FileInfo(path);
            TcpFileInfo tcpFileInfo = new TcpFileInfo(fileInfo.Name, fileInfo.Length);

            byte[] infoBuffer = tcpFileInfo.Serialize();

            Packet packet = new Packet(PacketType.FileSendStart, infoBuffer.Length);

            mNetStream.Write(packet.ToBytes(), 0, Packet.SIZE);
            mNetStream.Write(infoBuffer, 0, infoBuffer.Length);

            mFileSendingNotifier = new TcpTransferNotifier(tcpFileInfo.Length);

            ThreadPool.QueueUserWorkItem((o) =>
            {
                FileStream fs = null;

                try
                {
                    Packet sendingPacket = new Packet(PacketType.FileSending, 0);
                    byte[] buffer        = new byte[FILE_TRANS_SIZE];
                    byte[] encrypted;
                    int read = 0;

                    fs = new FileStream(path, FileMode.Open);

                    while (fs.Position != fs.Length)
                    {
                        read      = fs.Read(buffer, 0, buffer.Length);
                        encrypted = mAES.Encrypt(buffer, 0, read);

                        sendingPacket.DataLength = encrypted.Length;

                        mNetStream.Write(sendingPacket.ToBytes(), 0, Packet.SIZE);
                        mNetStream.Write(encrypted, 0, encrypted.Length);

                        mFileSendingNotifier.Add(read);
                    }

                    mNetStream.Write(new Packet(PacketType.FileSendEnd, 0).ToBytes(), 0, Packet.SIZE);
                }
                catch (Exception e)
                {
                    Debug.Error($"파일을 {IP}에 전송하는 중 예외가 발생하였습니다. 연결을 종료합니다. : {e.Message}");
                    Disconnect();
                }
                finally
                {
                    fs?.Close();
                    mFileSending         = false;
                    mFileSendingNotifier = null;
                }
            });

            return(mFileSendingNotifier);
        }