Example #1
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 #2
0
        public void SendReceiptToFirstSt(Object obj)
        {
            Stopwatch framesReceptionWatch = new Stopwatch();

            _postReceipt = (SecondStPostToFirstStWt)obj;
            _sentReceipt = new BitArray(1);

            framesReceptionWatch.Start();
            _signalFromSecondBuffer.WaitOne();
            framesReceptionWatch.Stop();
            TimeSpan framesReceptionTime = framesReceptionWatch.Elapsed;

            if (framesReceptionTime.Milliseconds > 40)
            {
                _sentReceipt[0] = false;
                ConsoleHelper.WriteToConsole("станция 2", "отправляю REJ-запрос");
            }

            else
            {
                _sentReceipt[0] = true;
                for (int i = 0; i < _receivedFrames.Length; i++)
                {
                    Random rnd = new Random();

                    bool dataIsValid = (rnd.Next(1, 20) % 6) != 0;

                    if (dataIsValid == true)
                    {
                        ConsoleHelper.WriteToConsoleArray("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])),
                                                          FrameHelper.GetFrameData(_receivedFrames[i]));

                        string fileRow = FrameHelper.BitArrayToString(FrameHelper.GetFrameData(_receivedFrames[i]));
                        WriteDataToStFile(fileRow, true);
                    }
                    else
                    {
                        ConsoleHelper.WriteToConsole("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])),
                                                     "данные повреждены");
                        ConsoleHelper.WriteToConsole("станция 2", "отправляю REJ-запрос");
                        frameIsMissed = true;
                        //clear file data
                        WriteDataToStFile("", false);
                        _signalToFirstSt.Release();
                        break;
                    }
                }
            }

            _postReceipt(_sentReceipt);

            if (frameIsMissed == true)
            {
                _signalFromSecondBuffer.WaitOne();
                for (int i = 0; i < _receivedFrames.Length; i++)
                {
                    ConsoleHelper.WriteToConsoleArray("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])),
                                                      FrameHelper.GetFrameData(_receivedFrames[i]));

                    string fileRow = FrameHelper.BitArrayToString(FrameHelper.GetFrameData(_receivedFrames[i]));
                    WriteDataToStFile(fileRow, true);
                }
            }

            ConsoleHelper.WriteToConsole("станция 2", "отправил RR-ответ станции 1");
            _signalToFirstSt.Release();

            Stopwatch framesReceptionWatch2 = new Stopwatch();

            _sentReceipt = new BitArray(1);

            framesReceptionWatch2.Start();

            _signalFromSecondBuffer.WaitOne();
            framesReceptionWatch2.Stop();
            TimeSpan framesReceptionTime2 = framesReceptionWatch2.Elapsed;

            if (framesReceptionTime2.Milliseconds > 40)
            {
                _sentReceipt[0] = false;
                ConsoleHelper.WriteToConsole("станция 2", "Данные не получены");
            }

            else
            {
                _sentReceipt[0] = true;
                for (int i = 0; i < _receivedFrames.Length; i++)
                {
                    if (ValidData(_receivedFrames[i]) == true)
                    {
                        ConsoleHelper.WriteToConsoleArray("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])),
                                                          FrameHelper.GetFrameData(_receivedFrames[i]));

                        string fileRow = FrameHelper.BitArrayToString(FrameHelper.GetFrameData(_receivedFrames[i]));
                        WriteDataToStFile(fileRow, true);
                    }
                    else
                    {
                        ConsoleHelper.WriteToConsole("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])),
                                                     "данные повреждены");
                    }
                }
            }

            _postReceipt(_sentReceipt);
            ConsoleHelper.WriteToConsole("станция 2", "отправил RNR-ответ станции 1");

            _signalToFirstSt.Release();
        }