diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-11-20 10:07:19 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-11-20 10:07:19 -0500 |
| commit | a6b4da70d34679db3ff18e1f44f41832326a94d9 (patch) | |
| tree | 8ec2783d5dca180a40e964310fd0ede7a93e3274 /src | |
| parent | 8b4f036d69ee10612fb947e7748c8081d04b1b5c (diff) | |
| download | soen423-a6b4da70d34679db3ff18e1f44f41832326a94d9.zip | |
stash IL
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/derms/net/runicast/Connection.java | 170 | ||||
| -rw-r--r-- | src/main/java/derms/net/runicast/ControlMessage.java | 15 | ||||
| -rw-r--r-- | src/main/java/derms/net/runicast/ReliableUnicast.java | 39 | ||||
| -rw-r--r-- | src/main/java/derms/net/runicast/State.java | 5 | ||||
| -rw-r--r-- | src/main/java/derms/net/runicast/Type.java | 5 |
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 -} |