//constructor to set all of these variables from an RTP model pass
 public ClientModel(int rand, Video vid, RTPmodel rtp)
 {
     id              = rand;
     seq             = 1;
     _video          = vid;
     _RTPmodel       = rtp;
     _timer          = new RTSPtimer(rand);
     _timer.Interval = interval;
 }
Beispiel #2
0
        private void Time_Process(Object obj, ElapsedEventArgs args)
        {
            RTSPtimer t = (RTSPtimer)obj;

            for (int i = 0; i < _ClientModels.Count; i++)
            {
                if (_ClientModels.ElementAt(i).Get_ID() == t.Get_ID())
                {
                    _ClientModels.ElementAt(i).Inc_Seq();
                    RTPmodel   rtp      = _ClientModels.ElementAt(i).Get_RTP();
                    IPEndPoint ep       = rtp.Get_EndPoint();
                    Video      vid      = _ClientModels.ElementAt(i).Get_Video();
                    byte[]     rcv      = vid.Get_NextFrame();
                    RTPpacket  rtp_pack = new RTPpacket(rcv, _ClientModels.ElementAt(i).Get_Seq(), rcv.Length);

                    if (_view.Get_Check())
                    {
                        Add_Server(rtp_pack.Get_Header() + "\r\n");
                    }
                    rtp.Send_Data(rtp_pack.Get_Bytes());
                }
            }
        }
Beispiel #3
0
        public void Main_Handler(object o)
        {
            //networking variables
            Socket s = (Socket)o;

            byte[] rcv = new byte[264];
            //control variables
            int  cnt = 0;    //extension of the class count variable
            int  rnd = 0;    //extension of the class rand variable
            int  seq = 1;    //for the sequence number
            bool set = true; //setup is always initially true
            //class variables
            RTPmodel    _RTPmodel  = null;
            ClientModel _newClient = null;
            Video       _video     = null;

            //try and catch all potential socket reactions
            try
            {
                while (set)
                {
                    bool exit = false;
                    int  size = s.Receive(rcv);
                    if (size == 0)
                    {
                        break;
                    }
                    string size_mess = System.Text.Encoding.UTF8.GetString(rcv, 0, size);
                    _view.Add_Client_del(size_mess);
                    string check_set = System.Text.Encoding.UTF8.GetString(rcv, 0, 4);

                    if (check_set == "SETU" && set)
                    {
                        //rtp
                        string[] new_str = size_mess.Split(new char[] { '=' });
                        int      p       = int.Parse(new_str[1]);
                        _RTPmodel = new RTPmodel(p);

                        //video
                        string vid = System.Text.Encoding.UTF8.GetString(rcv, 28, 12);
                        _video = new Video(vid);
                        rnd    = Get_Random();

                        //client
                        _newClient = new ClientModel(rnd, _video, p);
                        _ClientModels.Add(_newClient);
                        cnt = count++;

                        //update serv
                        Add_Server("The client " + _ClientModels.ElementAt(cnt).Get_RTP().Get_EndPoint().ToString() + " is setting up\r\n");
                        _ClientModels.ElementAt(cnt).Get_Timer().Elapsed += Time_Process;

                        set = false;

                        //response
                        string reqt = "RTSP/1.0 200 OK\r\n";
                        string cseq = "CSeq: " + seq + "\r\n";
                        ++seq;
                        string sess = "Session: " + _ClientModels.ElementAt(cnt).Get_ID() + "\r\n";
                        string mess = reqt + cseq + sess + "\r\n";
                        byte[] mb   = System.Text.Encoding.ASCII.GetBytes(mess);
                        s.Send(mb);
                    }

                    //otherwise the setup is not required
                    while (!set)
                    {
                        int size_ns = s.Receive(rcv);
                        if (size == 0)
                        {
                            break;
                        }
                        string size_mess_ns = System.Text.Encoding.UTF8.GetString(rcv, 0, size);
                        _view.Add_Client_del(size_mess_ns);
                        string check_set_ns = System.Text.Encoding.UTF8.GetString(rcv, 0, 4);

                        //determine which action is being performed...
                        if (check_set_ns == "PLAY")
                        {
                            string reqt_play = "RTSP/1.0 200 OK\r\n";
                            string cseq_play = "CSeq: " + seq + "\r\n";
                            ++seq;
                            string sess_play = "Session: " + _ClientModels.ElementAt(cnt).Get_ID() + "\r\n";
                            string mess_play = reqt_play + cseq_play + sess_play + "\r\n";
                            byte[] mb_play   = System.Text.Encoding.ASCII.GetBytes(mess_play);
                            s.Send(mb_play);

                            Add_Server("The client " + _ClientModels.ElementAt(cnt).Get_RTP().Get_EndPoint().ToString() + " is playing " + _video.Get_Name() + "\r\n");
                            _ClientModels.ElementAt(cnt).startTimer();
                        }
                        else if (check_set_ns == "PAUS")
                        {
                            string reqt_paus = "RTSP/1.0 200 OK\r\n";
                            string cseq_paus = "CSeq: " + seq + "\r\n";
                            ++seq;
                            string sess_paus = "Session: " + rnd + "\r\n";
                            string mess_paus = reqt_paus + cseq_paus + sess_paus + "\r\n";
                            byte[] mb_paus   = System.Text.Encoding.ASCII.GetBytes(mess_paus);
                            s.Send(mb_paus);

                            Add_Server("The client " + _ClientModels.ElementAt(cnt).Get_RTP().Get_EndPoint().ToString() + " paused " + _video.Get_Name() + "\r\n");
                            _ClientModels.ElementAt(cnt).stopTimer();
                        }
                        else if (check_set_ns == "TEAR")
                        {
                            string reqt_stop = "RTSP/1.0 200 OK\r\n";
                            string cseq_stop = "CSeq: " + seq + "\r\n";
                            ++seq;
                            string sess_stop = "Session: " + rnd + "\r\n";
                            string mess_stop = reqt_stop + cseq_stop + sess_stop + "\r\n";
                            byte[] mb_stop   = System.Text.Encoding.ASCII.GetBytes(mess_stop);
                            s.Send(mb_stop);

                            Add_Server("The client " + _ClientModels.ElementAt(cnt).Get_RTP().Get_EndPoint().ToString() + " is tearing down " + _video.Get_Name() + "\r\n");
                            _ClientModels.ElementAt(cnt).stopTimer();

                            _ClientModels.ElementAt(cnt).Get_Video().Trash_Video();
                            this.used.Remove(_ClientModels.ElementAt(cnt).Get_ID());
                            set = true;
                        }
                        else
                        {
                            //dead state...
                        }
                    }
                    if (exit)
                    {
                        break;
                    }
                }
            }
            catch (SocketException e)
            {
                if (s != null)
                {
                    s.Close();
                }
            }
            finally
            {
                _ClientModels.ElementAt(cnt).stopTimer();
                s.Close();
            }
        }