Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package arq;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import comm.MyBuffer;
- import comm.MyFile;
- import comm.MyFrame;
- import comm.TxRx;
- public class sender {
- MyFile file;;
- int maxSeq; //seq goes from 0 to maxSeq
- int windowSize; //max. number of data packets not acknowledged
- int localPort; //the local port used to tx and rx packets
- int destPort; //the port at the other point
- MyBuffer buffer;
- List<Integer> framesWaitingACK; //a list of tx. sequence numbers waiting for ACK
- /**
- *
- * @param x
- * @param y
- * @return the modular when the first value is negative
- */
- private Integer mod(int x, int y)
- {
- Integer result = x % y;
- if (result < 0)
- {
- result += y;
- }
- return result;
- }
- /**
- * Remove all frames from framesWaitingACK with a seq number before the seqReceived
- * Remember how Go-Back-N works!!!
- * @param seqReceived is the seq received
- */
- private void removePreviousFramesBuffer(int seqReceived) {
- Integer rmSeq = mod(seqReceived-1,this.maxSeq+1);
- while (this.framesWaitingACK.contains(rmSeq)) {
- this.framesWaitingACK.remove(rmSeq);
- this.buffer.ack(rmSeq);
- rmSeq = mod(rmSeq-1,this.maxSeq+1);
- }
- }
- //constructor
- public sender(int windowSize, int maxSeq, int localPort, int destPort, String fileName) {
- this.file = new MyFile(fileName);
- this.maxSeq = maxSeq;
- this.windowSize = windowSize;
- this.localPort = localPort;
- this.destPort = destPort;
- buffer = new MyBuffer(windowSize);
- System.out.println("Buffer with "+windowSize+" positions");
- framesWaitingACK = new ArrayList<Integer>();
- }
- public static void main(String[] args) {
- int seq=0;
- if (args.length != 6) {
- System.out.println("Usage: sender windowSize maxSeq localPort destPort fileName debug");
- System.exit(-1);
- }
- sender s = new sender(Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2]),
- Integer.parseInt(args[3]), args[4].toString()); //sender object
- MyFrame rxFrame; //used to receive the control frame from the receiver
- boolean debug;
- Random rnd = new Random();
- rnd.setSeed(47);
- int readBytes;
- TxRx txrx = new TxRx(s.localPort);
- boolean ack = false;
- //this is used for debugging
- if (Integer.parseInt(args[5]) == 0) //output information
- debug = false;
- else
- debug = true;
- MyFrame[] framesSended = new MyFrame[s.windowSize]; //we need to build the first frame before the while loop
- for(int i = 0; i<s.windowSize; i++) {
- readBytes = rnd.nextInt(1000)+100; //random number of bytes to be read
- //read the first readBytes from the file
- String readString = s.file.nextBytes(readBytes);
- MyFrame frame = new MyFrame(0,i,readString);
- framesSended[i] = frame;
- }
- //the funny part starts here
- do { //frame is null 9when all content from the file was sent
- for(int i = 0; i<s.windowSize; i++) {
- s.buffer.addFrame(framesSended[i]);
- s.framesWaitingACK.add(new Integer(seq));
- }
- //frame about to be tx. added to the buffer
- // It is **key** to understand how buffer works!!!
- //seq number waiting for ACK... add it to the framesWaitingACK list
- //not strictly necessary in stop&wait
- ack = false;
- //this is Stop&Wait, so we have to wait for the ACK of the ongoing frame
- //before next frame can be processed
- int numberAck =0;
- while(numberAck!=s.windowSize) {
- if (debug)
- System.out.println("Transmitting frame: " + seq);
- txrx.send(s.buffer.getFrame(seq), s.destPort); //transmitting the frame!!!
- rxFrame = TxRx.getPacketFrame(txrx.receive()); //waiting till a control frame is received
- //control frame received
- if (rxFrame.CRCOK()) {
- //frame received and correct... what code does it have?
- if (rxFrame.getCode() == 1){ //ACK (RR)
- if (debug)
- System.out.println("ACK received with seq: " + rxFrame.getSeq());
- s.removePreviousFramesBuffer(rxFrame.getSeq());
- ack = true;
- numberAck++;//we can leave this while and build the next frame
- }
- else if (rxFrame.getCode() == 2) { //REJ received. Frame in buffer will be retransmitted
- if (debug)
- System.out.println("REJ received with seq: " + rxFrame.getSeq());
- }
- else
- System.out.println("Duplex is not implemented");
- }
- else
- System.out.println("The CRC is wrong!!!"); //Data frame will be transmitted again
- seq++;
- }
- for(int i = 0; i<s.windowSize; i++) {
- //OK, the next data frame can be generated
- readBytes = rnd.nextInt(1000)+100; //random for educational purposes only!
- String readString;
- readString = s.file.nextBytes(readBytes);
- MyFrame frame;
- if (readString != null) {
- seq = (seq+1)%(s.maxSeq+1); //new seq number
- frame = new MyFrame(0,seq,readString);
- framesSended[i] = frame;
- }
- else
- frame = null;
- }
- }while(true);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement