summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-20 10:07:19 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-20 10:07:19 -0500
commita6b4da70d34679db3ff18e1f44f41832326a94d9 (patch)
tree8ec2783d5dca180a40e964310fd0ede7a93e3274 /src
parent8b4f036d69ee10612fb947e7748c8081d04b1b5c (diff)
downloadsoen423-a6b4da70d34679db3ff18e1f44f41832326a94d9.zip
stash IL
Diffstat (limited to 'src')
-rw-r--r--src/main/java/derms/net/runicast/Connection.java170
-rw-r--r--src/main/java/derms/net/runicast/ControlMessage.java15
-rw-r--r--src/main/java/derms/net/runicast/ReliableUnicast.java39
-rw-r--r--src/main/java/derms/net/runicast/State.java5
-rw-r--r--src/main/java/derms/net/runicast/Type.java5
5 files changed, 0 insertions, 234 deletions
diff --git a/src/main/java/derms/net/runicast/Connection.java b/src/main/java/derms/net/runicast/Connection.java
deleted file mode 100644
index 99f99a7..0000000
--- a/src/main/java/derms/net/runicast/Connection.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package derms.net.runicast;
-
-import derms.net.ConcurrentDatagramSocket;
-import derms.net.Packet;
-import sun.reflect.generics.reflectiveObjects.NotImplementedException;
-
-import java.io.IOException;
-import java.io.NotActiveException;
-import java.net.*;
-import java.time.Duration;
-import java.time.Instant;
-import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.logging.Logger;
-
-public class Connection implements Runnable {
- private static final Random rng = new Random();
- private static final Duration roundTrip = Duration.ofMillis(100); // TODO: measure round trip time.
- private static final Duration rexitTimeout = roundTrip.multipliedBy(4);
- private static final Duration deathTimeout = roundTrip.multipliedBy(300);
- private static final int bufSize = 8192;
- private static final Duration terminationTimeout = Duration.ofSeconds(1);
-
- AtomicReference<State> state;
- final InetAddress laddr; // Local IP address.
- final int lport; // Local IL port.
- final InetAddress raddr; // Remote IP address.
- final int rport; // Remote IL port.
- final int id0; // Starting sequence number of the local side.
- final int rid0; // Starting sequence number of the remote side.
- int next; // Sequence number of the next message to be sent from the local side.
- int rcvd; // The last in-sequence message received from the remote side.
- int unacked; // Sequence number of the first unacked message.
- ConcurrentDatagramSocket sock;
- private final Logger log;
- private final ExecutorService pool;
-
- Connection(InetAddress laddr, int lport, InetAddress raddr, int rport, ConcurrentDatagramSocket sock) {
- this.state = new AtomicReference<State>(State.closed);
- this.laddr = laddr;
- this.lport = lport;
- this.raddr = raddr;
- this.rport = rport;
- this.id0 = rng.nextInt();
- this.next = this.id0;
- this.unacked = this.id0;
- this.sock = sock;
- this.log = Logger.getLogger(this.getClass().getName());
- this.pool = Executors.newCachedThreadPool();
- }
-
- public void close() {
- state.set(State.closed);
-
- pool.shutdownNow();
- try {
- if (!pool.awaitTermination(terminationTimeout.toMillis(), TimeUnit.MILLISECONDS))
- log.warning("Thread pool did not terminate after " + terminationTimeout);
- } catch (InterruptedException e) {
- log.warning("Interrupted while terminating thread pool: " + e.getMessage());
- // Preserve interrupt status.
- Thread.currentThread().interrupt();
- }
-
- sock.close();
- log.info("Finished shutting down.");
- }
-
- void start() {
- pool.execute(this);
- }
-
- @Override
- public void run() {
- for (;;) {
- if (Thread.interrupted())
- return;
-
- try {
- switch (state.get()) {
- case closed:
- return;
- case syncer:
- syncer();
- continue;
- case syncee:
- syncee();
- continue;
- case established:
- established();
- continue;
- case listening:
- listening();
- continue;
- case closing:
- closing();
- continue;
- case opening:
- opening();
- continue;
- default:
- throw new IllegalStateException("illegal connection state: " + state);
- }
- } catch (IOException | ClassNotFoundException e) {
- log.warning(e.getMessage());
- }
- }
- }
-
- private void syncer() throws IOException, ClassNotFoundException {
- Instant tstart = Instant.now();
- for (;;) {
- try {
- sendCtl(Type.sync, id0, 0);
-
- ControlMessage msg = recvCtl(rexitTimeout);
- if (msg.type == Type.ack && msg.ack != id0
- || msg.type == Type.close && msg.ack == id0) {
- state.set(State.closed);
- return;
- } else if (msg.type == Type.sync && msg.ack == id0) {
- state.set(State.established);
- return;
- }
- } catch (SocketTimeoutException e) {
- Duration elapsed = Duration.between(tstart, Instant.now());
- if (elapsed.compareTo(deathTimeout) > 0) {
- state.set(State.closed);
- return;
- }
- }
- }
- }
-
- private void syncee() {
- throw new NotImplementedException();
- }
-
- private void established() {
- throw new NotImplementedException();
- }
-
- private void listening() {
- throw new NotImplementedException();
- }
-
- private void closing() {
- throw new NotImplementedException();
- }
-
- private void opening() {
- throw new NotImplementedException();
- }
-
- private void sendCtl(Type type, int id, int ack) throws IOException {
- ControlMessage msg = new ControlMessage(type, id, ack);
- DatagramPacket pkt = Packet.encode(msg, raddr, rport);
- sock.send(pkt);
- }
-
- private ControlMessage recvCtl(Duration timeout) throws IOException, SocketTimeoutException, ClassNotFoundException {
- DatagramPacket pkt = new DatagramPacket(new byte[bufSize], bufSize);
- sock.setSoTimeout(timeout);
- sock.receive(pkt);
- return Packet.decode(pkt, ControlMessage.class);
- }
-}
diff --git a/src/main/java/derms/net/runicast/ControlMessage.java b/src/main/java/derms/net/runicast/ControlMessage.java
deleted file mode 100644
index b08ff98..0000000
--- a/src/main/java/derms/net/runicast/ControlMessage.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package derms.net.runicast;
-
-import java.io.Serializable;
-
-class ControlMessage implements Serializable {
- final Type type;
- final int id; // One greater than the sequence number of the highest sent data message.
- final int ack; // Last in-sequence data message received by the transmitter of the message.
-
- ControlMessage(Type type, int id, int ack) {
- this.type = type;
- this.id = id;
- this.ack = ack;
- }
-}
diff --git a/src/main/java/derms/net/runicast/ReliableUnicast.java b/src/main/java/derms/net/runicast/ReliableUnicast.java
deleted file mode 100644
index 6aa4e48..0000000
--- a/src/main/java/derms/net/runicast/ReliableUnicast.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package derms.net.runicast;
-
-import derms.net.ConcurrentDatagramSocket;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-
-/** TODO */
-public class ReliableUnicast {
- public static Connection listen(InetAddress laddr, int lport) {
- // TODO
- }
-
- public static Connection connect(InetAddress raddr, int rport) throws IOException {
- ConcurrentDatagramSocket sock = new ConcurrentDatagramSocket();
- sock.connect(raddr, rport);
- InetAddress laddr = sock.getLocalAddress();
- int lport = sock.getLocalPort();
- Connection conn = new Connection(laddr, lport, raddr, rport, sock);
-
- conn.state.set(State.syncer);
- conn.start();
- while (conn.state.get() == State.syncer)
- Thread.yield();
-
- State state = conn.state.get();
- switch (state) {
- case established:
- return conn;
- case closed:
- conn.close();
- throw new IOException("failed to connect to " + raddr + ":" + rport);
- default:
- conn.close();
- throw new IllegalStateException("illegal connection state: " + state);
- }
- }
-}
diff --git a/src/main/java/derms/net/runicast/State.java b/src/main/java/derms/net/runicast/State.java
deleted file mode 100644
index 5780ba3..0000000
--- a/src/main/java/derms/net/runicast/State.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package derms.net.runicast;
-
-public enum State {
- closed, syncer, syncee, established, listening, closing, opening
-}
diff --git a/src/main/java/derms/net/runicast/Type.java b/src/main/java/derms/net/runicast/Type.java
deleted file mode 100644
index b2d2943..0000000
--- a/src/main/java/derms/net/runicast/Type.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package derms.net.runicast;
-
-public enum Type {
- sync, data, dataquery, ack, query, state, close
-}