Ejemplo n.º 1
0
        //Dictionary<uint, DataPacket> received_packets;
        //DataPacket[] packets;
        private void ReceivePacket(DataPacket packet)
        {
            ////je to packet, ktery ocekavam
            ///
            if (ReceivedPackets[packet.Number] is null)
            {
                ReceivedPackets[packet.Number] = packet;
                UpdateAwaitedNum();
            }
            else
            {
                //return;
            }


            WriteStatus(AwaitedPacketNum, TotalPacketCount);

            byte[] resp = MessageConstructor.GetDataReceived(packet.Number, AwaitedPacketNum);
            Client.Send(resp, resp.Length);
        }
Ejemplo n.º 2
0
        private void OnClientDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (!MessageConstructor.ValidateMessage(e.Data))
            {
                if (StopAndWait)
                {
                    byte[] msg = MessageConstructor.GetDataReceived(uint.MinValue, uint.MaxValue);
                    Client.Send(msg, msg.Length);
                }

                return;
            }

            if (MessageConstructor.IsHandshake(e.Data))
            {
                Connect(BitConverter.ToUInt32(e.Data, 1), BitConverter.ToUInt32(e.Data, 1 + sizeof(int)), e.EndPoint);
                return;
            }

            if (IsTransfering && MessageConstructor.IsFileData(e.Data))
            {
                ReceivePacket(MessageConstructor.GetPacket(e.Data));
                return;
            }

            if (MessageConstructor.IsFileMeta(e.Data))
            {
                TotalPacketCount = BitConverter.ToUInt32(e.Data, 1 + sizeof(long));


                string fn = Encoding.ASCII.GetString(e.Data, 1 + sizeof(long) + sizeof(uint), e.Data.Length - 1 - sizeof(long) - sizeof(uint) - sizeof(uint));
                PrepareFile(fn);

                ReceivedPackets = new DataPacket[TotalPacketCount];

                Console.WriteLine($"Receiving file '{fn}', total of {TotalPacketCount} packets.");
                WriteStatus(0, TotalPacketCount, false);
                Client.Send(e.Data, e.Data.Length);

                //Client.ErrorRate = 0.001;
                //Client.DropRate = 0.01;
            }

            if (IsTransfering && MessageConstructor.IsFileEnd(e.Data))
            {
                WriteFile();

                uint hash = BitConverter.ToUInt32(e.Data, 1);

                uint computed = MessageConstructor.GetFileHash(FileName);

                if (hash == computed)
                {
                    FileReceived?.Invoke(this, new FileReceivedEventArgs()
                    {
                        FileName = FileName
                    });
                    _is_transfering = false;
                }
                else
                {
                    Console.WriteLine("Something is wrong, received different hash.");
                    _is_transfering = false;
                }
            }
        }