Example #1
0
        public void SendPortionOfData(ref BitArray[] sentFrames, ref PostDataToSecondBufWt postFrames, int startSendingInd, int portionSize)
        {
            BitArray[] portion = new BitArray[portionSize];

            Array.Copy(sentFrames, startSendingInd, portion, 0, portionSize);

            postFrames(portion);
        }
Example #2
0
        static void Main(string[] args)
        {
            ConsoleHelper.WriteToConsole("Главный поток", "");

            Semaphore connectionSem    = new Semaphore(1, 1);
            Semaphore disConnectionSem = new Semaphore(1, 1);
            Semaphore transmissionSem  = new Semaphore(1, 1);

            Semaphore firstStToSecondBuf  = new Semaphore(0, 1);
            Semaphore secondBufToSecondSt = new Semaphore(0, 1);
            Semaphore secondStToFirstSt   = new Semaphore(0, 1);

            Semaphore secondStToFirstBuf = new Semaphore(0, 1);
            Semaphore firstBufToFirstSt  = new Semaphore(0, 1);
            Semaphore firstStToSecondSt  = new Semaphore(0, 1);


            FirstStation firstStation = new FirstStation(ref firstStToSecondBuf, ref firstBufToFirstSt, ref secondStToFirstSt, ref firstStToSecondSt,
                                                         ref transmissionSem, ref connectionSem, ref disConnectionSem);
            FirstBuffer   firstBuffer   = new FirstBuffer(ref secondStToFirstBuf, ref firstBufToFirstSt);
            SecondStation secondStation = new SecondStation(ref secondBufToSecondSt, ref secondStToFirstBuf, ref firstStToSecondSt, ref secondStToFirstSt,
                                                            ref transmissionSem, ref connectionSem, ref disConnectionSem);
            SecondBuffer secondBuffer = new SecondBuffer(ref firstStToSecondBuf, ref secondBufToSecondSt);


            Thread firstThread  = new Thread(new ParameterizedThreadStart(firstStation.SendFramesToSecondBuf));
            Thread secondThread = new Thread(new ParameterizedThreadStart(secondBuffer.SendFramesToSecondSt));
            Thread thirdThread  = new Thread(new ParameterizedThreadStart(secondStation.SendReceiptToFirstSt));
            Thread forthThread  = new Thread(new ParameterizedThreadStart(secondStation.SendFramesToFirstBuf));
            Thread fifthThread  = new Thread(new ParameterizedThreadStart(firstBuffer.SendFramesToFirstSt));
            Thread sixthThread  = new Thread(new ParameterizedThreadStart(firstStation.SendReceiptToSecondSt));


            PostDataToSecondBufWt   postDataToSecondBufferWt = new PostDataToSecondBufWt(secondBuffer.ReceiveFrames);
            PostDataFromSecondBufWt postDataFromSecondBufWt  = new PostDataFromSecondBufWt(secondStation.ReceiveFrames);
            SecondStPostToFirstStWt postReceiptToFirstStWt   = new SecondStPostToFirstStWt(firstStation.ReceiveReceipt);


            PostDataToFirstBufWt    postDataToFirstBufferWt  = new PostDataToFirstBufWt(firstBuffer.ReceiveFrames);
            PostDataFromFirstBufWt  postDataFromFirstBufWt   = new PostDataFromFirstBufWt(firstStation.ReceiveFrames);
            FirstStPostToSecondStWt postReceiptToSecondtStWt = new FirstStPostToSecondStWt(secondStation.ReceiveReceipt);


            firstThread.Start(postDataToSecondBufferWt);
            secondThread.Start(postDataFromSecondBufWt);
            thirdThread.Start(postReceiptToFirstStWt);
            forthThread.Start(postDataToFirstBufferWt);
            fifthThread.Start(postDataFromFirstBufWt);
            sixthThread.Start(postReceiptToSecondtStWt);

            Console.ReadLine();
        }
Example #3
0
        public void SendFramesToSecondBuf(object obj)
        {
            _connectionSem.WaitOne();
            wantsToConnect = true;
            if (SecondStation.wantsToConnect == true)
            {
                ConsoleHelper.WriteToConsole("станция 1", "согласен на соединение");
            }
            else
            {
                ConsoleHelper.WriteToConsole("станция 1", "запрашиваю соединение");
            }
            _connectionSem.Release();

            _transmissionSem.WaitOne();

            SplitDataOnFragments();

            _postFrames = (PostDataToSecondBufWt)obj;
            SendPortionOfData(ref _sentFrames, ref _postFrames, 0, windowSize);
            ConsoleHelper.WriteToConsole("станция 1", "отправил кадры буферу 2");

            _signalToSecondBuffer.Release();

            _signalFromSecondSt.WaitOne();


            if (SecondStation.frameIsMissed == true)
            {
                ConsoleHelper.WriteToConsole("станция 1 полученный REJ-запрос", "1");
                SendPortionOfData(ref _sentFrames, ref _postFrames, 0, windowSize);
                ConsoleHelper.WriteToConsole("станция 1", "отправил кадры буферу 2");

                _signalToSecondBuffer.Release();

                _signalFromSecondSt.WaitOne();
            }


            ConsoleHelper.WriteToConsoleArray("станция 1 полученный RR-ответ", _receivedReceipt);
            SendPortionOfData(ref _sentFrames, ref _postFrames, windowSize, windowSize);
            ConsoleHelper.WriteToConsole("станция 1", "отправил кадры буферу 2");

            _signalToSecondBuffer.Release();


            _signalFromSecondSt.WaitOne();

            ConsoleHelper.WriteToConsoleArray("станция 1 полученный RNR-ответ", _receivedReceipt);

            _transmissionSem.Release();


            _disConnectionSem.WaitOne();
            wantsToDisconnect = true;
            if (SecondStation.wantsToDisconnect == true)
            {
                ConsoleHelper.WriteToConsole("станция 1", "согласен на разъединение");
            }
            else
            {
                ConsoleHelper.WriteToConsole("станция 1", "запрашиваю разъединение");
            }
            _disConnectionSem.Release();
        }