@@ -34,9 +34,10 @@ public class Rover {
34
34
INFINITY = 16 ,
35
35
UDP_PORT = 5353 ,
36
36
UDP_ACK_PORT = 5454 ,
37
+ ACK_WAIT_TIMEOUT = 1000 ,
37
38
WAIT_TIME_TILL_ROUTE_APPEARS = 5 , // Time to wait before checking if the route to the destination rover is up
38
39
MAX_HEADER_SIZE = 10 , // The maximum data a header can take (never listen for a packet smaller than this)
39
- MAX_PAYLOAD_SIZE = 10 ; // The chunks in which the data will be sent
40
+ MAX_PAYLOAD_SIZE = 100 ; // The chunks in which the data will be sent
40
41
private final static byte RIP_REQUEST = 1 ,
41
42
RIP_UPDATE = 2 ,
42
43
SUBNET_MASK = 24 ;
@@ -121,12 +122,17 @@ private void sendFile() {
121
122
byte [] recvBuffer = new byte [MAX_PAYLOAD_SIZE ];
122
123
DatagramPacket packet ;
123
124
124
- int bytesRead ;
125
+ int bytesRead = 0 ;
125
126
byte [] packetToSend , actualPacket ;
126
127
int seqNumber = 1 ;
127
- boolean synSent = false ;
128
+ boolean synSent = false , repeat = false ;
129
+
130
+ while (repeat || (bytesRead = bufferedInputStream .read (buffer , 0 , buffer .length )) != -1 ) {
131
+
132
+ if (repeat ){
133
+ LOGGER .info ("This is a repeat message because ACK was not received" );
134
+ }
128
135
129
- while ((bytesRead = bufferedInputStream .read (buffer , 0 , buffer .length )) != -1 ) {
130
136
// If the size of the buffer to be sent is less than MAX_PAYLOAD_SIZE, we will reduce it to have
131
137
// only the things we need
132
138
if (bytesRead < MAX_PAYLOAD_SIZE ) {
@@ -141,7 +147,7 @@ private void sendFile() {
141
147
synSent = true ;
142
148
} else {
143
149
packetToSend = JPacketUtil .jPacket2Arr (destAddress , this .myPrivateAddress ,
144
- seqNumber ++, DOES_NOT_MATTER , BitUtils .setBitInByte ((byte ) 0 , JPacketUtil .NORMAL_INDEX ),
150
+ repeat ? seqNumber - 1 : seqNumber ++, DOES_NOT_MATTER , BitUtils .setBitInByte ((byte ) 0 , JPacketUtil .NORMAL_INDEX ),
145
151
buffer , DOES_NOT_MATTER );
146
152
}
147
153
@@ -156,9 +162,18 @@ private void sendFile() {
156
162
LOGGER .info ("Sent the packet, Waiting for ACK\n " );
157
163
158
164
JPacket recvdJPacket ;
165
+ udpAckSocket .setSoTimeout (ACK_WAIT_TIMEOUT );
159
166
do {
160
167
packet = new DatagramPacket (recvBuffer , recvBuffer .length );
161
- udpAckSocket .receive (packet );
168
+ try {
169
+ udpAckSocket .receive (packet );
170
+ }
171
+ catch (SocketTimeoutException e ){
172
+ LOGGER .info ("ACK wait timer timed out" );
173
+ repeat = true ;
174
+ break ;
175
+ }
176
+ repeat = false ;
162
177
actualPacket = Arrays .copyOfRange (recvBuffer , 0 , packet .getLength ());
163
178
recvdJPacket = JPacketUtil .arr2JPacket (actualPacket );
164
179
} while (!JPacketUtil .isBitSet (recvdJPacket .flags , JPacketUtil .ACK_INDEX ) && recvdJPacket .ackNumber != seqNumber );
@@ -207,10 +222,15 @@ private void listenForFileTransfer() {
207
222
BitUtils .setBitInByte ((byte ) 0 , JPacketUtil .ACK_INDEX ),
208
223
new byte [0 ], DOES_NOT_MATTER );
209
224
225
+ // try{
226
+ // Thread.sleep(12000);
227
+ // }catch(InterruptedException e){
228
+ // e.printStackTrace();
229
+ // }
230
+
210
231
udpSocket .send (new DatagramPacket (ackPacket , ackPacket .length ,
211
232
routingTable .get (jPacket .sourceAddress ).nextHop , UDP_ACK_PORT ));
212
233
213
-
214
234
} else if (JPacketUtil .isBitSet (jPacket .flags , JPacketUtil .NORMAL_INDEX )) {
215
235
assert jPacket .payload != null ;
216
236
totalFileSize -= jPacket .payload .length ;
@@ -219,6 +239,12 @@ private void listenForFileTransfer() {
219
239
BitUtils .setBitInByte ((byte ) 0 , JPacketUtil .ACK_INDEX ),
220
240
new byte [0 ], DOES_NOT_MATTER );
221
241
242
+ // try{
243
+ // Thread.sleep(12000);
244
+ // }catch(InterruptedException e){
245
+ // e.printStackTrace();
246
+ // }
247
+
222
248
udpSocket .send (new DatagramPacket (ackPacket , ackPacket .length ,
223
249
routingTable .get (jPacket .sourceAddress ).nextHop , UDP_ACK_PORT ));
224
250
}
0 commit comments