private void dialogHost_DialogClosing(object sender, 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) { ParameterizedThreadStart pts = new ParameterizedThreadStart(RecFile); Thread trd = new Thread(pts); 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)); } }
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); }
public static byte[] Message2Byte(TransCtrl_Message am) { return(ByteConvertHelper.Object2Bytes(am)); }
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; } } }
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("连接已断开, 即将重新启动监听"); ResetAuthenInfo(); //重新开始监听 Thread threadWatch = new Thread(WatchingConn); threadWatch.IsBackground = true; threadWatch.Start(); WriteLog("开始监听"); })); 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(); this.Height += 40; snackbar_RecMessage.IsActive = true; })); } 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("对方拒绝接收"); })); } 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("校验失败,文件不可用"); })); } } }