private void UDPProtocol_0_1() { if (State != AppLogicState.WaitingForDropFile) return; do { IPEndPoint senderEndPoint = null; byte[] bytes = m_udpFileReceiver.EndReceive(m_udpFileReceiverResult, ref senderEndPoint); #if !DEBUG if (Dns.GetHostAddresses(Dns.GetHostName()).Any(i => i.Equals(senderEndPoint.Address))) break; #endif if (bytes == null || bytes[0] != UDP_PROTOCOL_STEP_0[0]) break; string relatPath = Encoding.Default.GetString(bytes.Skip(1).ToArray()); if (FileTransFound != null && FileTransFound(senderEndPoint.ToString() + " 要传输文件'" + relatPath + "',是否接受?")) { m_udpFileReceiver.Send(UDP_PROTOCOL_STEP_1, 1, senderEndPoint); } else break; int oldTimeout = m_udpFileReceiver.Client.ReceiveTimeout; ; m_udpFileReceiver.Client.ReceiveTimeout = UDP_RECEIVE_TIME_OUT; IPEndPoint senderEndPoint2 = null; try { bytes = m_udpFileReceiver.Receive(ref senderEndPoint2); } catch { bytes = null; } bool failed = false; if (!senderEndPoint.Equals(senderEndPoint2) || bytes == null || bytes[0] != UDP_PROTOCOL_STEP_2[0]) { failed = true; ErrorHandler("连接失败!"); } m_udpFileReceiver.Client.ReceiveTimeout = oldTimeout; if (failed) break; State = AppLogicState.ReceivingFile; do { bytes = m_udpFileReceiver.Receive(ref senderEndPoint); if (bytes.Length == 4 && senderEndPoint.Equals(senderEndPoint2)) break; } while (true); Program.Assert(m_tcpClient == null); m_tcpClient = new TcpClient(); m_tcpClient.Connect(senderEndPoint.Address, Program.FromByteArray<int>(bytes)); string localPath = null; { FolderBrowserDialog folder = new FolderBrowserDialog(); while (folder.ShowDialog() != DialogResult.OK) ; localPath = folder.SelectedPath; if (!localPath.EndsWith(Path.DirectorySeparatorChar.ToString())) localPath += Path.DirectorySeparatorChar.ToString(); if (relatPath.IndexOf('.') == -1) { while (Directory.Exists(localPath + relatPath)) relatPath = "_" + relatPath; localPath += relatPath; Directory.CreateDirectory(localPath); } else { localPath += relatPath; } } m_fileTransReceiver = new FileTransReceiver(localPath, m_tcpClient.GetStream()); m_fileTransReceiver.Aborted += Program.WrapThreadSafeDelegate(() => { if (ErrorHandler != null) ErrorHandler("传输中断!"); OnTransformEnd(); }); m_fileTransReceiver.TransCompleted += Program.WrapThreadSafeDelegate((Action<string>)(s => { if (s != null && ErrorHandler != null) ErrorHandler(s); OnTransformEnd(); })); m_fileTransReceiver.FileTransing += Program.WrapThreadSafeDelegate((Action<string>)(s => { m_transingFile = s; if (ProgressChanged != null) ProgressChanged(m_fileTransReceiver.TransedFileCount * 100 / m_fileTransReceiver.FileCount); })); m_fileTransReceiver.Work(); m_timer = new Stopwatch(); m_timer.Start(); } while (false); if (State == AppLogicState.WaitingForDropFile && m_udpFileReceiverResult.IsCompleted) { m_udpFileReceiverResult = m_udpFileReceiver.BeginReceive( o => Program.WrapThreadSafeDelegate(this.UDPProtocol_0_1)(), null); } }
private void UDPProtocol_0_1() { if (State != AppLogicState.WaitingForDropFile) { return; } do { IPEndPoint senderEndPoint = null; byte[] bytes = m_udpFileReceiver.EndReceive(m_udpFileReceiverResult, ref senderEndPoint); #if !DEBUG if (Dns.GetHostAddresses(Dns.GetHostName()).Any(i => i.Equals(senderEndPoint.Address))) { break; } #endif if (bytes == null || bytes[0] != UDP_PROTOCOL_STEP_0[0]) { break; } string relatPath = Encoding.Default.GetString(bytes.Skip(1).ToArray()); if (FileTransFound != null && FileTransFound(senderEndPoint.ToString() + " 要传输文件'" + relatPath + "',是否接受?")) { m_udpFileReceiver.Send(UDP_PROTOCOL_STEP_1, 1, senderEndPoint); } else { break; } int oldTimeout = m_udpFileReceiver.Client.ReceiveTimeout;; m_udpFileReceiver.Client.ReceiveTimeout = UDP_RECEIVE_TIME_OUT; IPEndPoint senderEndPoint2 = null; try { bytes = m_udpFileReceiver.Receive(ref senderEndPoint2); } catch { bytes = null; } bool failed = false; if (!senderEndPoint.Equals(senderEndPoint2) || bytes == null || bytes[0] != UDP_PROTOCOL_STEP_2[0]) { failed = true; ErrorHandler("连接失败!"); } m_udpFileReceiver.Client.ReceiveTimeout = oldTimeout; if (failed) { break; } State = AppLogicState.ReceivingFile; do { bytes = m_udpFileReceiver.Receive(ref senderEndPoint); if (bytes.Length == 4 && senderEndPoint.Equals(senderEndPoint2)) { break; } } while (true); Program.Assert(m_tcpClient == null); m_tcpClient = new TcpClient(); m_tcpClient.Connect(senderEndPoint.Address, Program.FromByteArray <int>(bytes)); string localPath = null; { FolderBrowserDialog folder = new FolderBrowserDialog(); while (folder.ShowDialog() != DialogResult.OK) { ; } localPath = folder.SelectedPath; if (!localPath.EndsWith(Path.DirectorySeparatorChar.ToString())) { localPath += Path.DirectorySeparatorChar.ToString(); } if (relatPath.IndexOf('.') == -1) { while (Directory.Exists(localPath + relatPath)) { relatPath = "_" + relatPath; } localPath += relatPath; Directory.CreateDirectory(localPath); } else { localPath += relatPath; } } m_fileTransReceiver = new FileTransReceiver(localPath, m_tcpClient.GetStream()); m_fileTransReceiver.Aborted += Program.WrapThreadSafeDelegate(() => { if (ErrorHandler != null) { ErrorHandler("传输中断!"); } OnTransformEnd(); }); m_fileTransReceiver.TransCompleted += Program.WrapThreadSafeDelegate((Action <string>)(s => { if (s != null && ErrorHandler != null) { ErrorHandler(s); } OnTransformEnd(); })); m_fileTransReceiver.FileTransing += Program.WrapThreadSafeDelegate((Action <string>)(s => { m_transingFile = s; if (ProgressChanged != null) { ProgressChanged(m_fileTransReceiver.TransedFileCount * 100 / m_fileTransReceiver.FileCount); } })); m_fileTransReceiver.Work(); m_timer = new Stopwatch(); m_timer.Start(); } while (false); if (State == AppLogicState.WaitingForDropFile && m_udpFileReceiverResult.IsCompleted) { m_udpFileReceiverResult = m_udpFileReceiver.BeginReceive( o => Program.WrapThreadSafeDelegate(this.UDPProtocol_0_1)(), null); } }