From f5eba59b191c77ae8f6a957d9296b70815cd37f7 Mon Sep 17 00:00:00 2001 From: senft-desktop Date: Thu, 29 Nov 2012 19:56:22 +0100 Subject: [PATCH] Send/receive status --- ws2012/P2P/uebungen/4/src/node/Node.java | 16 +++++- .../P2P/uebungen/4/src/node/UDPHandler.java | 53 ++++++++++++------- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/ws2012/P2P/uebungen/4/src/node/Node.java b/ws2012/P2P/uebungen/4/src/node/Node.java index 5ca61392..eada9491 100644 --- a/ws2012/P2P/uebungen/4/src/node/Node.java +++ b/ws2012/P2P/uebungen/4/src/node/Node.java @@ -202,6 +202,20 @@ public class Node { } } + protected void sendStatus(InetSocketAddress reveiver) { + ByteBuffer buffer = ByteBuffer.allocate(BUF_SIZE); + buffer.put(MessageType.STATUS); + for (SocketAddress n : neighbors) { + buffer.put(BufferUtil.addrToBytes((InetSocketAddress) n)); + } + + try { + channel.send(buffer, reveiver); + } catch (IOException e) { + e.printStackTrace(); + } + } + public void gatherInformationOfNetwork() { byte[] myAddr; try { @@ -222,7 +236,7 @@ public class Node { protected Ack getAck(int ack_id) { return acks.get(ack_id); } - + protected Ack removeAck(int ack_id) { return acks.remove(ack_id); } diff --git a/ws2012/P2P/uebungen/4/src/node/UDPHandler.java b/ws2012/P2P/uebungen/4/src/node/UDPHandler.java index dfec8155..b30e691b 100644 --- a/ws2012/P2P/uebungen/4/src/node/UDPHandler.java +++ b/ws2012/P2P/uebungen/4/src/node/UDPHandler.java @@ -4,7 +4,9 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -31,7 +33,7 @@ public class UDPHandler implements Runnable { } private void receiveInvite(SocketAddress from) { - LOGGER.log(Level.INFO, "{0} received invite from {1}", new Object[] { + LOGGER.log(Level.INFO, "{0}: received invite from {1}", new Object[] { node.getName(), from.toString() }); int ack_id = buf.getInt(); node.sendAck(from, ack_id); @@ -41,7 +43,8 @@ public class UDPHandler implements Runnable { private void receiveAck(SocketAddress from) { int ack_id = buf.getInt(); - LOGGER.log(Level.INFO, "{0} received ack ({1}) from {2}", new Object[] { + LOGGER.log(Level.INFO, "{0}: received ack ({1}) from {2}", + new Object[] { node.getName(), ack_id, from.toString() }); if (node.hasAck(ack_id)) { @@ -54,17 +57,6 @@ public class UDPHandler implements Runnable { } } - private boolean isNewBroadcast(int id) { - boolean isNew = true; - if (broadcastPackets.containsKey(id)) { - long receivedAt = broadcastPackets.get(id); - if (receivedAt < System.currentTimeMillis() + BROADCAST_TIMEOUT) { - isNew = false; - } - } - return isNew; - } - private void receiveLeave(SocketAddress from) { LOGGER.log(Level.INFO, "{0}: {1} is leaving. Deleting...", new Object[] { node.getName(), from.toString() }); @@ -81,6 +73,7 @@ public class UDPHandler implements Runnable { int packet_id = buf.getInt(); byte command = buf.get(); if (isNewBroadcast(packet_id)) { + // Save packet id so we don't forward a packet multiple times broadcastPackets.put(packet_id, System.currentTimeMillis()); switch (command) { @@ -97,7 +90,7 @@ public class UDPHandler implements Runnable { new Object[] { node.getName(), from.toString(), originalSender.toString() }); - // TODO: Answer with 'my' neighbors + node.sendStatus(originalSender); break; default: @@ -110,11 +103,21 @@ public class UDPHandler implements Runnable { } } else { LOGGER.log(Level.INFO, - "Received duplicate broadcast packet ({0}). Discarding...", - new Object[] { packet_id }); + "{0}: Received duplicate broadcast packet ({0}). Discarding...", + new Object[] { node.getName(), packet_id }); } } + private void receiveStatus(SocketAddress receivedFrom) { + List neighbors = new ArrayList(); + + while (buf.hasRemaining()) { + neighbors.add(readIPFromBuffer()); + } + + // Keep track of all neighbors.. + } + private InetSocketAddress readIPFromBuffer() { StringBuilder theAddr = new StringBuilder(); // Read 4 Bytes and 1 Integer = 1 IP address @@ -138,13 +141,24 @@ public class UDPHandler implements Runnable { LOGGER.log( Level.INFO, - "{0} from {1} received new neighbor:{2}", + "{0}: from {1} received new neighbor:{2}", new Object[] { node.getName(), from.toString(), newNeighbor.toString() }); node.sendAck(from, ack_id); } + private boolean isNewBroadcast(int id) { + boolean isNew = true; + if (broadcastPackets.containsKey(id)) { + long receivedAt = broadcastPackets.get(id); + if (receivedAt < System.currentTimeMillis() + BROADCAST_TIMEOUT) { + isNew = false; + } + } + return isNew; + } + public void run() { SocketAddress receivedFrom = null; @@ -175,10 +189,13 @@ public class UDPHandler implements Runnable { case MessageType.BROADCAST: receiveBroadcast(receivedFrom); break; + case MessageType.STATUS: + receiveStatus(receivedFrom); + break; default: LOGGER.log( Level.INFO, - "{0} received unknown command from {1}: [{2}]{3}", + "{0}: received unknown command from {1}: [{2}]{3}", new Object[] { node.getName(), receivedFrom.toString(), messageType, new String(buf.array()) });