예제 #1
0
        private void OnFileBlockDataPacket(Peer peer, byte[] data)
        {
            FileBlockDataPacket d = new FileBlockDataPacket();

            d.Decode(sbuff_[peer.EndPoint.ToString()].RawData, 0, sbuff_[peer.EndPoint.ToString()].Length);

            msgbuff[peer.EndPoint.ToString()].Append(d.data3k, d.len);

            FileBlockBeginPacket begin2 = new FileBlockBeginPacket();

            master.Send(peer, begin2.Encode());
        }
예제 #2
0
        private void OnFileBlockBeginPacket(Peer peer, byte[] data)
        {
            FileBlockBeginPacket begin = new FileBlockBeginPacket();

            master.Send(peer, begin.Encode());

            var    taskid = subTask_[peer.EndPoint.ToString()].Id;
            Action act    = () =>
            {
                this.Blocks[taskid].Status = Controls.Block.BlockStatus.Downloading;
            };

            GlobalMessageCenter.Instance.Send("MainWindow.UIThreadInvoke", act);
        }
예제 #3
0
        void Download()
        {
            if (task_ != null)
            {
                Console.WriteLine("Download begin task id = " + task_.Id.ToString());
                byte[] data = HttpDownloadRange.Download(task_.RemotePath, task_.from, task_.to);
                Console.WriteLine("Download end");

                Console.WriteLine("trans begin");
                FileBlockBeginPacket begin = new FileBlockBeginPacket();
                autoResetEvent_.WaitOne();
                Program.slave.Send(begin.Encode());
                byte[] b3k = new byte[1024 * 3];
                int    c   = (data.Length + 3071) / 3072;
                for (int i = 0; i < c - 1; ++i)
                {
                    Array.Copy(data, 1024 * 3 * i, b3k, 0, 1024 * 3);
                    FileBlockDataPacket d = new FileBlockDataPacket(b3k);
                    autoResetEvent_.WaitOne();
                    Program.slave.Send(d.Encode());
                }
                int lastBlockSize = data.Length % 3072;
                if (lastBlockSize == 0)
                {
                    lastBlockSize = 3072;
                }
                {
                    byte[] bxk = new byte[lastBlockSize];
                    Array.Copy(data, 1024 * 3 * (c - 1), bxk, 0, lastBlockSize);
                    FileBlockDataPacket d = new FileBlockDataPacket(bxk);
                    autoResetEvent_.WaitOne();
                    Program.slave.Send(d.Encode());
                }
                FileBlockEndPacket end = new FileBlockEndPacket();
                autoResetEvent_.WaitOne();
                Program.slave.Send(end.Encode());
                Console.WriteLine("trans end");
            }
        }
예제 #4
0
        void Download()
        {
            if (task_ != null)
            {
                LogManager.Instalce.DownloadTaskBeginLog(task_.RemotePath, task_.from, task_.to);
                byte[] data = HttpDownloadRange.Download(task_.RemotePath, task_.from, task_.to);
                LogManager.Instalce.DownloadTaskEndLog(task_.RemotePath, task_.from, task_.to);

                LogManager.Instalce.TransferBegin(task_.RemotePath, task_.from, task_.to);
                FileBlockBeginPacket begin = new FileBlockBeginPacket();
                autoResetEvent_.WaitOne();
                Peer.Send(begin.Encode());
                byte[] b3k = new byte[1024 * 3];
                int    c   = (data.Length + 3071) / 3072;
                for (int i = 0; i < c - 1; ++i)
                {
                    Array.Copy(data, 1024 * 3 * i, b3k, 0, 1024 * 3);
                    FileBlockDataPacket d = new FileBlockDataPacket(b3k);
                    autoResetEvent_.WaitOne();
                    Peer.Send(d.Encode());
                }
                int lastBlockSize = data.Length % 3072;
                if (lastBlockSize == 0)
                {
                    lastBlockSize = 3072;
                }
                {
                    byte[] bxk = new byte[lastBlockSize];
                    Array.Copy(data, 1024 * 3 * (c - 1), bxk, 0, lastBlockSize);
                    FileBlockDataPacket d = new FileBlockDataPacket(bxk);
                    autoResetEvent_.WaitOne();
                    Peer.Send(d.Encode());
                }
                FileBlockEndPacket end = new FileBlockEndPacket();
                autoResetEvent_.WaitOne();
                Peer.Send(end.Encode());
                LogManager.Instalce.TransferEnd(task_.RemotePath, task_.from, task_.to);
            }
        }
예제 #5
0
파일: Program.cs 프로젝트: sgww/cozy
        static void Main(string[] args)
        {
            SlavePeer slave = new SlavePeer();

            slave.Start(IPAddress.Any, 48361, new SlavePeerListener());

            MasterPeer master = new MasterPeer();

            master.Start(IPAddress.Any, 48360, new MasterPeerListener());
            var peer = new Peer()
            {
                EndPoint = new IPEndPoint(IPAddress.Parse("10.20.208.27"), 48361)
            };

            master.Connect(peer);

            Console.ReadKey();
            StringPacket sp = new StringPacket("hehe");

            master.Send(peer, sp.Encode());

            Console.ReadKey();
            // 传输3M的数据
            FileBlockBeginPacket begin = new FileBlockBeginPacket();

            master.Send(peer, begin.Encode());
            byte[] b3k = new byte[1024 * 3];
            for (int i = 0; i < 1024; ++i)
            {
                FileBlockDataPacket d = new FileBlockDataPacket(b3k);
                master.Send(peer, d.Encode());
            }
            FileBlockEndPacket end = new FileBlockEndPacket();

            master.Send(peer, end.Encode());

            Console.ReadKey();
        }
예제 #6
0
파일: Program.cs 프로젝트: sgww/cozy
        public void OnMessage(Peer peer, byte[] msg)
        {
            Array.Copy(msg, 0,
                       sbuff_[peer.EndPoint.ToString()],
                       sbufflen_[peer.EndPoint.ToString()], msg.Length);
            sbufflen_[peer.EndPoint.ToString()] += msg.Length;
            PacketTest t = new PacketTest(sbuff_[peer.EndPoint.ToString()], 0);

            if (t.PacketLength > sbufflen_[peer.EndPoint.ToString()])
            {
                // string s = "拆包"; ok
            }
            else if (t.PacketLength < sbufflen_[peer.EndPoint.ToString()])
            {
                //string s = "粘包";
            }
            else if (t.PacketLength == sbufflen_[peer.EndPoint.ToString()])
            {
                switch (t.PacketId)
                {
                case 1:
                    StringPacket packet = new StringPacket();
                    packet.Decode(sbuff_[peer.EndPoint.ToString()], 0, sbufflen_[peer.EndPoint.ToString()]);
                    Console.WriteLine("OnMessage - " + packet.data);
                    break;

                case 10001:
                    Console.WriteLine("OnMessage - FileBlockBeginPacket");
                    FileBlockBeginPacket begin = new FileBlockBeginPacket();
                    Program.master.Send(peer, begin.Encode());
                    break;

                case 10002:
                    FileBlockDataPacket d = new FileBlockDataPacket();
                    d.Decode(sbuff_[peer.EndPoint.ToString()], 0, sbufflen_[peer.EndPoint.ToString()]);
                    Array.Copy(d.data3k, 0, buff_[peer.EndPoint.ToString()], i_[peer.EndPoint.ToString()] * 1024 * 3, d.data3k.Length);
                    i_[peer.EndPoint.ToString()]++;
                    FileBlockBeginPacket begin2 = new FileBlockBeginPacket();
                    Program.master.Send(peer, begin2.Encode());
                    break;

                case 10003:
                    i_[peer.EndPoint.ToString()] = 0;
                    Console.WriteLine("OnMessage - FileBlockEndPacket");
                    subTask_[peer.EndPoint.ToString()].data = buff_[peer.EndPoint.ToString()];
                    var len = subTask_[peer.EndPoint.ToString()].to - subTask_[peer.EndPoint.ToString()].from + 1;
                    if (len != Program.task.BlockSize)
                    {
                        subTask_[peer.EndPoint.ToString()].data = new byte[len];
                        Array.Copy(buff_[peer.EndPoint.ToString()], 0, subTask_[peer.EndPoint.ToString()].data, 0, len);
                    }
                    if (!Program.task.UpdateTaskState(subTask_[peer.EndPoint.ToString()], 2))
                    {
                        subTask_[peer.EndPoint.ToString()] = Program.task.GetSubTask();
                        if (subTask_[peer.EndPoint.ToString()] != null)
                        {
                            FileBlockTask f = new FileBlockTask(subTask_[peer.EndPoint.ToString()]);
                            Program.master.Send(peer, f.Encode());
                        }
                    }
                    break;
                }
                sbufflen_[peer.EndPoint.ToString()] = 0;
            }
        }