Skip to content

Commit c59508d

Browse files
committed
Add timeouts for missing ACKs
1 parent 4ab7495 commit c59508d

File tree

1 file changed

+33
-7
lines changed

1 file changed

+33
-7
lines changed

src/Rover.java

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ public class Rover {
3434
INFINITY = 16,
3535
UDP_PORT = 5353,
3636
UDP_ACK_PORT = 5454,
37+
ACK_WAIT_TIMEOUT = 1000,
3738
WAIT_TIME_TILL_ROUTE_APPEARS = 5, // Time to wait before checking if the route to the destination rover is up
3839
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
4041
private final static byte RIP_REQUEST = 1,
4142
RIP_UPDATE = 2,
4243
SUBNET_MASK = 24;
@@ -121,12 +122,17 @@ private void sendFile() {
121122
byte[] recvBuffer = new byte[MAX_PAYLOAD_SIZE];
122123
DatagramPacket packet;
123124

124-
int bytesRead;
125+
int bytesRead=0;
125126
byte[] packetToSend, actualPacket;
126127
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+
}
128135

129-
while ((bytesRead = bufferedInputStream.read(buffer, 0, buffer.length)) != -1) {
130136
// If the size of the buffer to be sent is less than MAX_PAYLOAD_SIZE, we will reduce it to have
131137
// only the things we need
132138
if (bytesRead < MAX_PAYLOAD_SIZE) {
@@ -141,7 +147,7 @@ private void sendFile() {
141147
synSent = true;
142148
} else {
143149
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),
145151
buffer, DOES_NOT_MATTER);
146152
}
147153

@@ -156,9 +162,18 @@ private void sendFile() {
156162
LOGGER.info("Sent the packet, Waiting for ACK\n");
157163

158164
JPacket recvdJPacket;
165+
udpAckSocket.setSoTimeout(ACK_WAIT_TIMEOUT);
159166
do {
160167
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;
162177
actualPacket = Arrays.copyOfRange(recvBuffer, 0, packet.getLength());
163178
recvdJPacket = JPacketUtil.arr2JPacket(actualPacket);
164179
} while (!JPacketUtil.isBitSet(recvdJPacket.flags, JPacketUtil.ACK_INDEX) && recvdJPacket.ackNumber != seqNumber);
@@ -207,10 +222,15 @@ private void listenForFileTransfer() {
207222
BitUtils.setBitInByte((byte) 0, JPacketUtil.ACK_INDEX),
208223
new byte[0], DOES_NOT_MATTER);
209224

225+
// try{
226+
// Thread.sleep(12000);
227+
// }catch(InterruptedException e){
228+
// e.printStackTrace();
229+
// }
230+
210231
udpSocket.send(new DatagramPacket(ackPacket, ackPacket.length,
211232
routingTable.get(jPacket.sourceAddress).nextHop, UDP_ACK_PORT));
212233

213-
214234
} else if (JPacketUtil.isBitSet(jPacket.flags, JPacketUtil.NORMAL_INDEX)) {
215235
assert jPacket.payload != null;
216236
totalFileSize -= jPacket.payload.length;
@@ -219,6 +239,12 @@ private void listenForFileTransfer() {
219239
BitUtils.setBitInByte((byte) 0, JPacketUtil.ACK_INDEX),
220240
new byte[0], DOES_NOT_MATTER);
221241

242+
// try{
243+
// Thread.sleep(12000);
244+
// }catch(InterruptedException e){
245+
// e.printStackTrace();
246+
// }
247+
222248
udpSocket.send(new DatagramPacket(ackPacket, ackPacket.length,
223249
routingTable.get(jPacket.sourceAddress).nextHop, UDP_ACK_PORT));
224250
}

0 commit comments

Comments
 (0)