diff --git a/ws2012/P2P/uebungen/4/src/node/Node.java b/ws2012/P2P/uebungen/4/src/node/Node.java index aca269ec..c77880b4 100644 --- a/ws2012/P2P/uebungen/4/src/node/Node.java +++ b/ws2012/P2P/uebungen/4/src/node/Node.java @@ -69,7 +69,7 @@ public class Node { // LOGGER.info("Name: " + getName() + ", Spawning new node."); Node newNode = new Node(); - int ack_id = generateAck(MessageType.INVITE, newNode.getAddress()); + int ack_id = generateAck(newNode.getAddress()); buf.clear(); buf.put(MessageType.INVITE); buf.putInt(ack_id); @@ -86,7 +86,14 @@ public class Node { return newNode; } - public int generateAck(byte type, SocketAddress addr) { + /** + * Adds a new ack, which this node is expecting to receive. + * + * @param addr + * the SocketAddress the ack should be received from + * @return the identifier for this ack + */ + public int generateAck(SocketAddress addr) { int ack_id = generator.nextInt(); acks.put(ack_id, new Ack(addr)); return ack_id; @@ -97,11 +104,11 @@ public class Node { } private void sendAddrTo(SocketAddress receiver, SocketAddress addr) { - buf.clear(); InetSocketAddress a = (InetSocketAddress) addr; + int ack_id = generateAck(addr); + buf.clear(); buf.put(MessageType.NEW_NEIGHBOR); - int ack_id = generateAck(MessageType.NEW_NEIGHBOR, addr); buf.putInt(ack_id); for (String part : a.getHostString().split("\\.")) { @@ -119,6 +126,27 @@ public class Node { } } + /** + * Sends an acknowledgment message to receiver (who hopefully is expecting + * it) + * + * @param receiver + * the node expecting an ack + * @param ack_id + * the id to identify the ack + */ + private void sendAckTo(SocketAddress receiver, int ack_id) { + buf.clear(); + buf.put(MessageType.ACK); + buf.putInt(ack_id); + buf.flip(); + try { + channel.send(buf, receiver); + } catch (IOException e) { + // TODO + } + } + /** * This node circularly links all neighbors (no mesh!) and removes itself * from the network. @@ -131,16 +159,14 @@ public class Node { if (neighbors.size() > 2) { int pred = ((i - 1) + neighbors.size()) % neighbors.size(); int succ = (i + 1) % neighbors.size(); - sendAddrTo(neighbors.get(i), neighbors.get(succ)); - sendAddrTo(neighbors.get(i), neighbors.get(pred)); } else if (neighbors.size() == 2) { sendAddrTo(neighbors.get(i), neighbors.get(Math.abs(i - 1))); } buf.clear(); - int ack_id = generateAck(MessageType.LEAVE, neighbors.get(i)); + int ack_id = generateAck(neighbors.get(i)); buf.put(MessageType.LEAVE); buf.putInt(ack_id); buf.flip(); @@ -206,11 +232,7 @@ public class Node { ack_id = buf.getInt(); - buf.clear(); - buf.put(MessageType.ACK); - buf.putInt(ack_id); - buf.flip(); - channel.send(buf, receivedFrom); + sendAckTo(receivedFrom, ack_id); neighbors.add(receivedFrom); break; @@ -251,11 +273,7 @@ public class Node { } ack_id = buf.getInt(); - buf.clear(); - buf.put(MessageType.ACK); - buf.putInt(ack_id); - buf.flip(); - channel.send(buf, receivedFrom); + sendAckTo(receivedFrom, ack_id); break; case MessageType.NEW_NEIGHBOR: @@ -283,11 +301,7 @@ public class Node { + new_neighbor.toString()); } - buf.clear(); - buf.put(MessageType.ACK); - buf.putInt(ack_id); - buf.flip(); - channel.send(buf, receivedFrom); + sendAckTo(receivedFrom, ack_id); break;