Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.94 KB | None | 0 0
  1. package arq;
  2.  
  3.  
  4.  
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.Random;
  8.  
  9. import comm.MyBuffer;
  10. import comm.MyFile;
  11. import comm.MyFrame;
  12. import comm.TxRx;
  13.  
  14. public class sender {
  15.  
  16. MyFile file;;
  17. int maxSeq; //seq goes from 0 to maxSeq
  18. int windowSize; //max. number of data packets not acknowledged
  19. int localPort; //the local port used to tx and rx packets
  20. int destPort; //the port at the other point
  21. MyBuffer buffer;
  22. List<Integer> framesWaitingACK; //a list of tx. sequence numbers waiting for ACK
  23.  
  24. /**
  25. *
  26. * @param x
  27. * @param y
  28. * @return the modular when the first value is negative
  29. */
  30. private Integer mod(int x, int y)
  31. {
  32. Integer result = x % y;
  33. if (result < 0)
  34. {
  35. result += y;
  36. }
  37. return result;
  38. }
  39.  
  40. /**
  41. * Remove all frames from framesWaitingACK with a seq number before the seqReceived
  42. * Remember how Go-Back-N works!!!
  43. * @param seqReceived is the seq received
  44. */
  45. private void removePreviousFramesBuffer(int seqReceived) {
  46. Integer rmSeq = mod(seqReceived-1,this.maxSeq+1);
  47.  
  48. while (this.framesWaitingACK.contains(rmSeq)) {
  49. this.framesWaitingACK.remove(rmSeq);
  50. this.buffer.ack(rmSeq);
  51. rmSeq = mod(rmSeq-1,this.maxSeq+1);
  52. }
  53. }
  54.  
  55. //constructor
  56. public sender(int windowSize, int maxSeq, int localPort, int destPort, String fileName) {
  57. this.file = new MyFile(fileName);
  58. this.maxSeq = maxSeq;
  59. this.windowSize = windowSize;
  60. this.localPort = localPort;
  61. this.destPort = destPort;
  62. buffer = new MyBuffer(windowSize);
  63. System.out.println("Buffer with "+windowSize+" positions");
  64. framesWaitingACK = new ArrayList<Integer>();
  65. }
  66.  
  67. public static void main(String[] args) {
  68. int seq=0;
  69.  
  70. if (args.length != 6) {
  71. System.out.println("Usage: sender windowSize maxSeq localPort destPort fileName debug");
  72. System.exit(-1);
  73. }
  74. sender s = new sender(Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2]),
  75. Integer.parseInt(args[3]), args[4].toString()); //sender object
  76. MyFrame rxFrame; //used to receive the control frame from the receiver
  77. boolean debug;
  78. Random rnd = new Random();
  79. rnd.setSeed(47);
  80. int readBytes;
  81. TxRx txrx = new TxRx(s.localPort);
  82. boolean ack = false;
  83.  
  84. //this is used for debugging
  85. if (Integer.parseInt(args[5]) == 0) //output information
  86. debug = false;
  87. else
  88. debug = true;
  89.  
  90.  
  91. MyFrame[] framesSended = new MyFrame[s.windowSize]; //we need to build the first frame before the while loop
  92. for(int i = 0; i<s.windowSize; i++) {
  93. readBytes = rnd.nextInt(1000)+100; //random number of bytes to be read
  94. //read the first readBytes from the file
  95. String readString = s.file.nextBytes(readBytes);
  96. MyFrame frame = new MyFrame(0,i,readString);
  97. framesSended[i] = frame;
  98. }
  99. //the funny part starts here
  100. do { //frame is null 9when all content from the file was sent
  101. for(int i = 0; i<s.windowSize; i++) {
  102. s.buffer.addFrame(framesSended[i]);
  103. s.framesWaitingACK.add(new Integer(seq));
  104. }
  105. //frame about to be tx. added to the buffer
  106. // It is **key** to understand how buffer works!!!
  107. //seq number waiting for ACK... add it to the framesWaitingACK list
  108. //not strictly necessary in stop&wait
  109. ack = false;
  110. //this is Stop&Wait, so we have to wait for the ACK of the ongoing frame
  111. //before next frame can be processed
  112. int numberAck =0;
  113. while(numberAck!=s.windowSize) {
  114.  
  115. if (debug)
  116. System.out.println("Transmitting frame: " + seq);
  117.  
  118. txrx.send(s.buffer.getFrame(seq), s.destPort); //transmitting the frame!!!
  119. rxFrame = TxRx.getPacketFrame(txrx.receive()); //waiting till a control frame is received
  120. //control frame received
  121. if (rxFrame.CRCOK()) {
  122. //frame received and correct... what code does it have?
  123. if (rxFrame.getCode() == 1){ //ACK (RR)
  124. if (debug)
  125. System.out.println("ACK received with seq: " + rxFrame.getSeq());
  126. s.removePreviousFramesBuffer(rxFrame.getSeq());
  127. ack = true;
  128. numberAck++;//we can leave this while and build the next frame
  129. }
  130. else if (rxFrame.getCode() == 2) { //REJ received. Frame in buffer will be retransmitted
  131. if (debug)
  132. System.out.println("REJ received with seq: " + rxFrame.getSeq());
  133. }
  134. else
  135. System.out.println("Duplex is not implemented");
  136. }
  137. else
  138. System.out.println("The CRC is wrong!!!"); //Data frame will be transmitted again
  139. seq++;
  140. }
  141. for(int i = 0; i<s.windowSize; i++) {
  142. //OK, the next data frame can be generated
  143. readBytes = rnd.nextInt(1000)+100; //random for educational purposes only!
  144. String readString;
  145. readString = s.file.nextBytes(readBytes);
  146. MyFrame frame;
  147. if (readString != null) {
  148. seq = (seq+1)%(s.maxSeq+1); //new seq number
  149.  
  150. frame = new MyFrame(0,seq,readString);
  151. framesSended[i] = frame;
  152. }
  153. else
  154. frame = null;
  155.  
  156.  
  157.  
  158. }
  159.  
  160. }while(true);
  161. }
  162.  
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement