Ejemplo n.º 1
0
        private void dialogHost_DialogClosing(object sender, MaterialDesignThemes.Wpf.DialogClosingEventArgs eventArgs)
        {
            if (Equals(eventArgs.Parameter, true))
            {
                //确认接收
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter           = "All files(*.*)|*.*";
                sfd.FileName         = dialogHost_TextBox_FileName.Text;
                sfd.InitialDirectory = Environment.CurrentDirectory;
                if (sfd.ShowDialog() == true)
                {
                    Thread trd = new Thread(RecFile);
                    trd.IsBackground = true;

                    File_Info fi = new File_Info(sfd.FileName, Convert.ToInt64(dialogHost_TextBox_FileLength.Text));

                    trd.Start(fi);

                    TransCtrl_Message tm = new TransCtrl_Message(Status_Flag.Transmit_Allow, DateTime.Now, dialogHost_TextBox_FileName.Text, 0);
                    socketConn.Send(Message2Byte(tm));
                }
            }
            else
            {
                //拒绝接收
                TransCtrl_Message tm = new TransCtrl_Message(Status_Flag.Transmit_Cancel, DateTime.Now, dialogHost_TextBox_FileName.Text, 0);
                socketConn.Send(Message2Byte(tm));
            }
        }
Ejemplo n.º 2
0
        private void button_sendFile_Click(object sender, RoutedEventArgs e)
        {
            if (!IsAuthenticated)
            {
                this.Dispatcher.Invoke(new Action(() =>
                {
                    snackbar.MessageQueue.Enqueue("请先进行认证");
                }));
                return;
            }

            FileInfo fi = null;

            try
            {
                fi = new FileInfo(textBox_filePath.Text);

                if (!fi.Exists)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        snackbar.MessageQueue.Enqueue("文件不存在,请重新选择文件");
                    }));
                    return;
                }
            }
            catch
            {
                this.Dispatcher.Invoke(new Action(() =>
                {
                    snackbar.MessageQueue.Enqueue("文件路径有误");
                }));
                return;
            }

            TransCtrl_Message tm = new TransCtrl_Message(Status_Flag.Transmit_Request, DateTime.Now, fi.Name, fi.Length);

            socketConn.Send(Message2Byte(tm));

            SendFileInfo = new File_Info(textBox_filePath.Text, fi.Length);
        }
Ejemplo n.º 3
0
        private void DecryptData(object fileParam)
        {
            File_Info fi = (File_Info)fileParam;

            //填充后的长度
            long file_length  = fi.FileLength + ((fi.FileLength % 16 == 0) ? 0 : (16 - fi.FileLength % 16));
            long read_offset  = 0;
            long write_offset = 0;
            //需要读取的长度
            int read_size  = File_Buffer_Size;
            int write_size = File_Buffer_Size;

            while (true)
            {
                //如果是最后一个分块则修改size
                if (read_offset + File_Buffer_Size > file_length)
                {
                    read_size  = (int)(file_length % (long)File_Buffer_Size);
                    write_size = (int)(fi.FileLength % (long)File_Buffer_Size);
                }

                while (true)
                {
                    //如果不足一块则等待
                    if (!File.Exists(fi.FileName + ".tmp") || new FileInfo(fi.FileName + ".tmp").Length < read_offset + read_size)
                    {
                        continue;
                    }
                    break;
                }

                _rwlock.EnterReadLock();
                byte[] Read_Buffer = FileRead(fi.FileName + ".tmp", read_offset, read_size);
                _rwlock.ExitReadLock();
                read_offset += read_size;

                byte[] Write_Buffer = null;
                try
                {
                    Write_Buffer = DataCrypto.Decrypt(Read_Buffer, AES);
                }
                catch (Exception ex)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog(ex.ToString());
                        WriteLog("数据块解密过程出错");
                        snackbar.MessageQueue.Enqueue("数据块解密过程出错");

                        //终止传输
                        try
                        {
                            socketRecFile.Shutdown(SocketShutdown.Both);
                            socketRecFile.Close();
                            socketRecFile = null;
                        }
                        catch (Exception e)
                        {
                            WriteLog(e.ToString());
                            WriteLog("停止接收 " + new FileInfo(fi.FileName).Name);
                            snackbar.MessageQueue.Enqueue("停止接收 " + new FileInfo(fi.FileName).Name);
                        }
                    }));
                    break;
                }

                FileWrite(fi.FileName, write_offset, write_size, Write_Buffer);

                write_offset += write_size;

                if (write_offset >= fi.FileLength)
                {
                    //删除tmp文件
                    File.Delete(fi.FileName + ".tmp");

                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog(new FileInfo(fi.FileName).Name + " 解密完毕,正在计算校验值");
                        snackbar.MessageQueue.Enqueue(new FileInfo(fi.FileName).Name + "解密完毕");

                        progressBar_recFile.IsIndeterminate = false;
                    }));

                    //计算校验值
                    string file_hash = null;
                    using (MD5 md5Hash = MD5.Create())
                    {
                        FileStream fs   = new FileStream(fi.FileName, FileMode.Open, FileAccess.Read);
                        byte[]     hash = md5Hash.ComputeHash(fs);
                        file_hash = Convert.ToBase64String(hash);
                    }

                    //回送消息
                    TransCtrl_Message tm = new TransCtrl_Message(Status_Flag.Transmit_Over, DateTime.Now, file_hash, 0);
                    socketConn.Send(Message2Byte(tm));

                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog(new FileInfo(fi.FileName).Name + " 的本地校验值为" + file_hash);
                        WriteLog("发送 " + new FileInfo(fi.FileName).Name + " 的校验值");
                        snackbar.MessageQueue.Enqueue("等待对方校验");
                    }));
                    break;
                }
            }
        }
Ejemplo n.º 4
0
        private void TransControl()
        {
            while (true)
            {
                int    length = -1;
                byte[] buffer = new byte[Command_Buffer_Size];
                try
                {
                    length = socketConn.Receive(buffer);
                }
                catch (Exception ex)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog(ex.ToString());
                        WriteLog("连接已断开");
                        snackbar.MessageQueue.Enqueue("连接已断开,请重新连接至服务");

                        button_connect.IsEnabled = true;
                        button_connect.Content   = "尝试连接";

                        ResetAuthenInfo();
                    }));
                    break;
                }

                if (length <= 0)
                {
                    continue;
                }

                byte[] message = new byte[length];
                Array.Copy(buffer, message, length);

                TransCtrl_Message tm = (TransCtrl_Message)Byte2Message(message, "TransCtrl_Message");

                this.Dispatcher.Invoke(new Action(() =>
                {
                    listBox_packetInfo.Items.Insert(0, tm.MessageInfo());
                }));

                if (tm.Flag == Status_Flag.Transmit_Request)
                {
                    string file_length;
                    if (tm.FileLength > 1024 * 1024 * 1024)
                    {
                        double fl = (double)tm.FileLength / (1024 * 1024 * 1024);
                        file_length = fl.ToString("f2") + "GB";
                    }
                    else if (tm.FileLength > 1024 * 1024)
                    {
                        double fl = (double)tm.FileLength / (1024 * 1024);
                        file_length = fl.ToString("f2") + "MB";
                    }
                    else if (tm.FileLength > 1024)
                    {
                        double fl = (double)tm.FileLength / 1024;
                        file_length = fl.ToString("f2") + "KB";
                    }
                    else
                    {
                        file_length = tm.FileLength.ToString() + "B";
                    }

                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog("收到文件传输请求");

                        dialogHost_TextBox_FileName.Text   = tm.FileName;
                        dialogHost_TextBox_FileLength.Text = tm.FileLength.ToString();
                        snackbar_RecMessage.IsActive       = true;
                        this.Height += 40;
                    }));
                }

                if (tm.Flag == Status_Flag.Transmit_Allow)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog("对方准备接收");

                        ParameterizedThreadStart pts = new ParameterizedThreadStart(SendFile);
                        Thread threadWatch           = new Thread(pts);
                        threadWatch.IsBackground     = true;
                        threadWatch.Start(SendFileInfo);
                    }));
                }

                if (tm.Flag == Status_Flag.Transmit_Cancel)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog("对方拒绝接收");

                        snackbar.MessageQueue.Enqueue("对方拒绝接收");
                    }));
                    break;
                }

                if (tm.Flag == Status_Flag.Transmit_Over)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog("对方请求校验文件");
                        WriteLog("校验值为" + tm.FileName);
                        snackbar.MessageQueue.Enqueue("正在校验");
                    }));

                    //计算校验值
                    string file_hash = null;
                    using (MD5 md5Hash = MD5.Create())
                    {
                        FileStream fs   = new FileStream(SendFileInfo.FileName, FileMode.Open, FileAccess.Read);
                        byte[]     hash = md5Hash.ComputeHash(fs);
                        file_hash = Convert.ToBase64String(hash);
                    }

                    if (file_hash == tm.FileName)
                    {
                        //回送消息
                        TransCtrl_Message tcm = new TransCtrl_Message(Status_Flag.VerifySuccess, DateTime.Now, null, 0);
                        socketConn.Send(Message2Byte(tcm));

                        this.Dispatcher.Invoke(new Action(() =>
                        {
                            WriteLog("本地校验值为" + file_hash);
                            WriteLog("校验成功");
                            snackbar.MessageQueue.Enqueue("校验成功,文件发送成功");
                        }));
                    }
                    else
                    {
                        //回送消息
                        TransCtrl_Message tcm = new TransCtrl_Message(Status_Flag.VerifyFailed, DateTime.Now, null, 0);
                        socketConn.Send(Message2Byte(tcm));

                        this.Dispatcher.Invoke(new Action(() =>
                        {
                            WriteLog("本地校验值为" + file_hash);
                            WriteLog("校验失败");
                            snackbar.MessageQueue.Enqueue("校验失败,文件发送失败");
                        }));
                    }
                }

                if (tm.Flag == Status_Flag.VerifySuccess)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog("校验成功,文件可用");
                        snackbar.MessageQueue.Enqueue("校验成功,文件可用");
                    }));
                }

                if (tm.Flag == Status_Flag.VerifyFailed)
                {
                    this.Dispatcher.Invoke(new Action(() =>
                    {
                        WriteLog("校验失败,文件不可用");
                        snackbar.MessageQueue.Enqueue("校验失败,文件不可用");
                    }));
                }
            }
        }
Ejemplo n.º 5
0
 public static byte[] Message2Byte(TransCtrl_Message am)
 {
     return(ByteConvertHelper.Object2Bytes(am));
 }