private void sendRetryFrame() { Frame retFrame = new Frame(new byte[0], Data.RETFrame); stopSendingFrames(); Console.WriteLine("Sending RET..."); physicalLayer.sendFrame(retFrame.serialize()); continueSendingFrames(); }
private void sendLinkFrame() { while (true) { if (physicalLayer.connectionActive) { if (linkFramesSended >= 3) { linkStatus = false; return; } else { if (canSend) { Frame LinkFrame = new Frame(new byte[0], Data.LINKFrame); stopSendingFrames(); Console.WriteLine("Sending LINK..."); physicalLayer.sendFrame(LinkFrame.serialize()); continueSendingFrames(); linkFramesSended += 1; } } } Thread.Sleep(Data.LinkFrameTimeout); } }
//Обработка информационного кадра private void processInfoFrame(Frame frame) { Frame ackFrame = new Frame(new byte[0], Data.ACKFrame); Console.WriteLine(getString(frame.getData())); stopSendingFrames(); Console.WriteLine("Sending ACK..."); physicalLayer.sendFrame(ackFrame.serialize()); continueSendingFrames(); this.stringsBuffer.Enqueue(getString(frame.getData())); }
private void sendLinkAckFrame() { Frame LinkACKFrame = new Frame(new byte[0], Data.LINK_ACKFrame); while (!canSend) { } stopSendingFrames(); Console.WriteLine("Sending LINK_ACK..."); physicalLayer.sendFrame(LinkACKFrame.serialize()); continueSendingFrames(); }
//Обработка системного кадра private void processControlFrame(Frame frame) { //Если пришел ACK, то удалять из очереди и ставить флаг wasSended = false if (frame.getType() == Data.ACKFrame) { lock (framesToSend) { Frame pulled = null; framesToSend.TryDequeue(out pulled); } Console.WriteLine("ACK received"); this.frameWasSended = false; } //Если пришел RET, то ставить флаг wasSended = false; if (frame.getType() == Data.RETFrame) { this.frameWasSended = false; } if (frame.getType() == Data.LINKFrame) { sendLinkAckFrame(); } if (frame.getType() == Data.LINK_ACKFrame) { linkStatus = true; linkFramesSended = 0; } }