Ejemplo n.º 1
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;
                }
            }
        }
Ejemplo n.º 2
0
        //called if there are new data
        private void OnClientDataReceived(object sender, DataReceivedEventArgs e)
        {
            //neplatne zpravy zahazujeme
            if (!MessageConstructor.ValidateMessage(e.Data))
            {
                return;
            }

            if (MessageConstructor.IsHandshake(e.Data))
            {
                handshake_response = e.Data;
                return;
            }

            if (MessageConstructor.IsDataReceived(e.Data))
            {
                uint rc_packet_num = BitConverter.ToUInt32(e.Data, 1);
                uint aw_packet_num = BitConverter.ToUInt32(e.Data, 1 + sizeof(uint));

                if (StopAndWait && rc_packet_num == UInt32.MinValue && aw_packet_num == UInt32.MaxValue)
                {
                    // rezim stop and go => pouze jeden packet na ceste a prijemce prijal chybnou zpravu
                    // posli znova packet
                    Client.SendPacket(Packets[0], Target);
                    return;
                }

                PacketsMutex.WaitOne();
                for (int i = 0; i < MaxPackets; ++i)
                {
                    if (Packets[i].AckCount == -1)
                    {
                        continue;
                    }
                    //if (Packets[i].Number == packet_num)
                    //{
                    //    is_pending = true;
                    //    Packets[i].OnReceive();
                    //    packet_num--;
                    //    AckPackets.Add(i);
                    //}

                    if (Packets[i].Number == rc_packet_num)
                    {
                        Packets[i].OnReceive();
                        //rc_packet_num--;
                        AckPackets.Add(i);
                        DeliveredPacketCount++;
                    }
                    if (Packets[i].Number == aw_packet_num)
                    {
                        Packets[i].AckCount++;
                        if (Packets[i].AckCount >= 3)
                        {
                            Client.SendPacket(Packets[i], Target);
                        }
                    }
                }

                PacketsMutex.ReleaseMutex();
                //Console.WriteLine($"Received ACK of {packet_num}");
                return;
            }

            if (MessageConstructor.IsFileMeta(e.Data))
            {
                meta_response = e.Data;
                return;
            }
        }