コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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;
            }
        }