private void SlidingWindow(TimeSpan tsSend_Time, bool bIsGoBackN) { object[] arr_Frames = Q_Frames.ToArray(); if (Q_Frames.Count != 0)//Sending Frames { objFrame.Fxpos += fspeed * objFrame.Fvec_X; lbl_sender.Text = "Sending " + arr_Frames[0].ToString(); lbl_receiver.Text = "Receiving " + arr_Frames[0].ToString(); if (objFrame.Fxpos + dlen > nwidth)//frame reached Rx { object Objreceivedframe = Q_Frames.Dequeue(); if (tsSend_Time.Seconds < dtimeout) //within time { if (bcontinue_receive) //sending was not interrupted,receive frames normally { LBx_Receiver.Items.Add(Objreceivedframe); LBx_Log.Items.Add(Objreceivedframe.ToString() + " received"); Q_Acks.Enqueue(Objreceivedframe); objAck = new clssSqaure(nwidth, -20, -1, color_yellow);//Send Ack lst_clssSqaure.Add(objAck); } } else//frame exceeded time { LBx_Log.Items.Add(Objreceivedframe.ToString() + " timed out"); if (bIsGoBackN && bcontinue_receive) { LBx_Log.Items.Add("Rx stopped receiving"); bcontinue_receive = false;//stop receiving } } dtstart = DateTime.Now; //reset time objFrame.Fxpos = 10 - nwidth; //reset Frame position } } if (Q_Acks.Count != 0)//Sending Ack { objAck.Fxpos += fspeed * 2 * objAck.Fvec_X; if (((objAck.Fxpos - dlen + 10) < (nwidth * -1)))//Ack arrived to Tx { LBx_Log.Items.Add("Ack received"); LBx_Sender.Items.Remove(Q_Acks.Dequeue()); lst_clssSqaure.Remove(objAck); } } if (Q_Frames.Count == 0 && Q_Acks.Count == 0) { lbl_receiver.Text = lbl_sender.Text = "Ready"; lbl_TimeElapsed.Text = string.Empty; } }
private void btn_Send_Click(object sender, EventArgs e) { #region Initialization lst_clssSqaure.Clear(); objFrame = new clssSqaure(10 - nwidth, 20, 1, color_Blue); lst_clssSqaure.Add(objFrame); bsend_file = true; dtstart = DateTime.Now; if (txt_Timeout.Text != string.Empty) { dtimeout = int.Parse(txt_Timeout.Text); } else { dtimeout = 3;//default value } #endregion if (rb_stp_wait.Checked) { if (LBx_Sender.SelectedIndex < 0) { MessageBox.Show("please select frame to send", "Info", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } objselected_frame_stp_wt = LBx_Sender.SelectedItem; } else { if (!bcontinue_receive) { bcontinue_receive = true; } //modify window size to the count of remaining items nwin_size = Convert.ToInt32(num_win_size.Value); if (nwin_size > LBx_Sender.Items.Count) { nwin_size = LBx_Sender.Items.Count; } for (int i = 0; i < nwin_size; i++) { Q_Frames.Enqueue(LBx_Sender.Items[i]); } } timer1.Enabled = simpleOpenGlControl1.Visible = true; }
private void transform() { TimeSpan tsSend_Time = DateTime.Now - dtstart; lbl_TimeElapsed.Text = tsSend_Time.ToString(); if (rb_stp_wait.Checked) { #region Stop & Wait #region Explanation /* * Stop after Transmitting a Frame * Wait for an Acknowledgement * * * Tx Rx * * Frame_0 * |------------------->| * | | * | Ack| * |<-------------------| * | | * | | * |Frame_1 | * |----------> | * | Timeout| * | NAck| * |<-------------------| * | | * | | * Frame_2 * |------------------->| * | | * | Ack| * | <----------| * | | * |Timeout | */ #endregion if (objselected_frame_stp_wt != null) { if (tsSend_Time.Seconds > dtimeout) //send time exceeded predetermined timeout { if (bsend_file) //Rx didnt receive Frame { lbl_receiver.Text = "Timeout"; } else //Tx didnt receive Acknowledgment { lbl_sender.Text = "Timeout"; } timer1.Enabled = false;//stop sending } if (bsend_file)//Frame is being sent to Rx { if (LBx_Receiver.Items.Contains(objselected_frame_stp_wt)) { lbl_sender.Text = "Resending " + objselected_frame_stp_wt.ToString(); } else { lbl_sender.Text = "Sending " + objselected_frame_stp_wt.ToString(); } if ((objFrame.Fxpos + dlen) > nwidth)//frame arrived to Rx { if (!LBx_Receiver.Items.Contains(objselected_frame_stp_wt)) { LBx_Receiver.Items.Add(objselected_frame_stp_wt); } lbl_sender.Text = "awaiting acknowledgement"; lbl_receiver.Text = "sending acknowledgement"; bsend_file = false; dtstart = DateTime.Now; objAck = new clssSqaure(nwidth, -20, -1, color_yellow); lst_clssSqaure.Add(objAck); } objFrame.Fxpos += fspeed * objFrame.Fvec_X; } else//Ack is being sent to Tx { if (((objAck.Fxpos - dlen + 10) < (nwidth * -1)))//Ack arrived to Tx { lbl_sender.Text = "Acknowledgement received"; if (LBx_Receiver.Items.Contains(objselected_frame_stp_wt)) { LBx_Sender.Items.Remove(objselected_frame_stp_wt); } timer1.Enabled = false; bsend_file = true; } objAck.Fxpos += fspeed * objAck.Fvec_X; } } #endregion } else if (rb_goback_N.Checked) { #region Go Back N #region Explanation /* * the sending process continues to send a number of frames specified by * a window size without waiting for the ACK packet from the receiver. * * if any frame was lost or damaged, or the ACK acknowledging them was lost or damaged, * then that frame and all following frames in the window * (even if they were received without error) will be re-sent. */ #endregion SlidingWindow(tsSend_Time, true /*Is it GoBackN*/); #endregion } else { #region Selective Repeat #region Explanation /* The sending process continues to send a number of frames specified by a window size even after a frame loss. * Unlike Go-Back-N ARQ, the receiving process will continue to accept and acknowledge frames sent after an initial * error. * Only faulted frames will be resent. * */ #endregion SlidingWindow(tsSend_Time, false /*Is it GoBackN*/); #endregion } }