Пример #1
0
        private void OnTransformEnd()
        {
            switch (State)
            {
                case AppLogicState.SendingFile:
                    m_tcpClient.Close(); m_tcpClient = null;
                    m_tcpServer.Stop(); m_tcpServer = null;
                    m_fileTransSender.Dispose();  m_fileTransSender = null;

                    break;
                case AppLogicState.ReceivingFile:
                    m_tcpClient.Close(); m_tcpClient = null;
                    m_fileTransReceiver.Dispose();  m_fileTransReceiver = null;

                    break;
                default:
                    break;
            }

            State = AppLogicState.WaitingForDropFile;
            if (m_udpFileReceiverResult.IsCompleted)
            {
                m_udpFileReceiverResult = m_udpFileReceiver.BeginReceive(
                    o => Program.WrapThreadSafeDelegate(this.UDPProtocol_0_1)(), null);
            }

            m_transingFile = string.Empty;
            m_timer = null;
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
            }
        }