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; } } }
//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; } }