private void btn_Send_Click(object sender, EventArgs e) { #region Initialization lst_clssSqaure.Clear(); objPacket = new clssSqaure(10 - winwidth, 20, 1, color_Violet); lst_clssSqaure.Add(objPacket); send_file = true; dtstart = DateTime.Now; if (txt_Timeout.Text != string.Empty) { durtimeout = int.Parse(txt_Timeout.Text); } else { durtimeout = 3;//default value } #endregion if (rbn_goback_N.Checked) { if (!continue_receive) { continue_receive = true; } //modify window size to the count of remaining items WindowSize = Convert.ToInt32(num_win_size.Value); if (WindowSize > Lstbx_Sender.Items.Count) { WindowSize = Lstbx_Sender.Items.Count; } for (int i = 0; i < WindowSize; i++) { QueuePacs.Enqueue(Lstbx_Sender.Items[i]); } timer1.Enabled = simpleOpenGlControl1.Visible = true; } else { if (!continue_receive) { continue_receive = true; } //modify window size to the count of remaining items WindowSize = Convert.ToInt32(num_win_size.Value); if (WindowSize > Lstbx_Sender.Items.Count) { WindowSize = Lstbx_Sender.Items.Count; } for (int i = 0; i < WindowSize; i++) { QueuePacs.Enqueue(Lstbx_Sender.Items[i]); } timer1.Enabled = simpleOpenGlControl1.Visible = true; } }
private void SlidingWindow(TimeSpan tsSend_Time, bool bIsGoBackN) { object[] arr_Frames = QueuePacs.ToArray(); if (QueuePacs.Count != 0)//Sending Frames { objPacket.Packxpos += pacspeed * objPacket.Packv_X; lbl_sender.Text = "Sending " + arr_Frames[0].ToString(); lbl_receiver.Text = "Receiving " + arr_Frames[0].ToString(); if (objPacket.Packxpos + drlen > winwidth)//frame reached Recceiver { object Objreceivedframe = QueuePacs.Dequeue(); if (tsSend_Time.Seconds < durtimeout) //within time { if (continue_receive) //sending was not interrupted,receive frames normally { Lstbx_Receiver.Items.Add(Objreceivedframe); Lstbx_Log.Items.Add(Objreceivedframe.ToString() + " Received"); Lstbx_Log.Items.Add("Time elapsed " + tsSend_Time.Milliseconds + " MilliSeconds"); QueueAcks.Enqueue(Objreceivedframe); objAck = new clssSqaure(winwidth, -20, -1, color_Red);//Send Ack lst_clssSqaure.Add(objAck); } } else//frame exceeded time { Lstbx_Log.Items.Add(Objreceivedframe.ToString() + " Timed out"); if (bIsGoBackN && continue_receive) { Lstbx_Log.Items.Add("Receiver stopped receiving"); Lstbx_Log.Items.Add("Time elapsed " + tsSend_Time.Milliseconds + "MilliSeconds"); continue_receive = false;//stop receiving } } dtstart = DateTime.Now; //reset time objPacket.Packxpos = 10 - winwidth; //reset Frame position } } if (QueueAcks.Count != 0)//Sending Ack { objAck.Packxpos += pacspeed * 2 * objAck.Packv_X; if (((objAck.Packxpos - drlen + 10) < (winwidth * -1)))//Ack arrived to Tx { int counter; Lstbx_Log.Items.Add("Hurray Acknowledge received");//h counter = Lstbx_Log.Items.Count / 3; Lstbx_Log.Items.Add("Total no: of packets received " + counter); Lstbx_Sender.Items.Remove(QueueAcks.Dequeue()); lst_clssSqaure.Remove(objAck); } } if (QueuePacs.Count == 0 && QueueAcks.Count == 0) { lbl_receiver.Text = lbl_sender.Text = "Ready"; lbl_TimeElapsed.Text = string.Empty; } }