initial commit
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 27 Mar 2022 18:48:31 +0000 (13:48 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 27 Mar 2022 18:48:31 +0000 (13:48 -0500)
doc.md [new file with mode: 0644]
src/host.onyx [new file with mode: 0644]
src/module.onyx [new file with mode: 0644]
src/packet.onyx [new file with mode: 0644]
src/peer.onyx [new file with mode: 0644]
src/protocol.onyx [new file with mode: 0644]
udp_client.onyx [new file with mode: 0644]
udp_server.onyx [new file with mode: 0644]

diff --git a/doc.md b/doc.md
new file mode 100644 (file)
index 0000000..ee9fd13
--- /dev/null
+++ b/doc.md
@@ -0,0 +1,22 @@
+# Onyx-Net
+
+Stable and reliable networking protocol on top of UDP for
+games and applications. It is based off of ENet, but is not compatible
+in the slightest with it.
+
+A single server is connected to by multiple clients using a UDP Socket
+each. On each socket, multiple channels are used. Each channel supports:
+    - Sequencing
+    - Reliable transmissions
+    - Commands (control codes)
+These are supported independent of the other channels. This enable the
+programmer to use sequencial packets for data that needs to arrive in
+order, and unsequencial / unreliable packets for things like movement
+updates.
+
+This protocol will also support larger transmissions, though for
+practically, assume that anything over 1MB in size should probably be
+transferred in a different way, or chunked up by the application layer.
+
+
+
diff --git a/src/host.onyx b/src/host.onyx
new file mode 100644 (file)
index 0000000..dfce83b
--- /dev/null
@@ -0,0 +1,11 @@
+package onyx_net
+
+Host :: struct {
+    socket : net.Socket;
+    addr   : net.Socket_Address;
+
+    peers  : [] Peer;
+    maximum_peers: u32;
+}
+
+
diff --git a/src/module.onyx b/src/module.onyx
new file mode 100644 (file)
index 0000000..c07d176
--- /dev/null
@@ -0,0 +1,10 @@
+package onyx_net
+
+#package {
+    array :: package core.array
+    net   :: package core.net
+    list  :: package core.list
+    alloc :: package core.alloc
+}
+
+#load_all "./."
diff --git a/src/packet.onyx b/src/packet.onyx
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/peer.onyx b/src/peer.onyx
new file mode 100644 (file)
index 0000000..483e941
--- /dev/null
@@ -0,0 +1,29 @@
+package onyx_net
+
+Peer_State :: enum {
+    Disconnected;
+    Connecting;
+    Acknowledging_Connection;
+    Connection_Pending;
+    Connection_Successed;
+    Connection;
+    Disconnect_Later;
+    Disconnecting;
+    Acknowledging_Disconnect;
+    Zombie;
+}
+
+Peer :: struct {
+    host: ^Host;
+    addr: net.Socket_Address;
+    state: Peer_State;
+
+    channels: [] Channel;
+}
+
+
+
+Channel :: struct {
+    seq_number: u16;
+    
+}
diff --git a/src/protocol.onyx b/src/protocol.onyx
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/udp_client.onyx b/udp_client.onyx
new file mode 100644 (file)
index 0000000..dec1e2d
--- /dev/null
@@ -0,0 +1,43 @@
+#load "core/std"
+
+use package core
+
+octets_to_addr :: (a, b, c, d: u8) -> u32 {
+    return (cast(u32) a << 24) |
+           (cast(u32) b << 16) |
+           (cast(u32) c << 8)  |
+           (cast(u32) d << 0);
+}
+
+main :: (args) => {
+    udp_socket, err := net.socket_create(.Inet, .Dgram);
+    assert(err == .None, "Failed to create socket");
+    defer udp_socket->close();
+
+    dest_addr: net.Socket_Address;
+    dest_addr.port = 8080;
+    // dest_addr.addr = octets_to_addr(45, 76, 30, 19);
+    dest_addr.addr = octets_to_addr(127, 0, 0, 1);
+
+
+    random.set_seed(12341);
+    for 1000 {
+        to_send := random.string(50, alpha_numeric=true);
+
+        sent_bytes := udp_socket->sendto(to_send, ^dest_addr);
+        printf("Sent {} bytes!\n", sent_bytes);
+
+        string.free(to_send);
+    }
+
+    for 1000 {
+        recv_buffer: [1024] u8;
+        recv_addr, recv_bytes := udp_socket->recvfrom(recv_buffer);
+
+        tmp := recv_addr->addr_as_str();
+        printf("{} sent {} bytes\n", tmp, recv_bytes);
+        string.free(tmp);
+
+        printf("{}\n", recv_buffer[0 .. recv_bytes]);
+    }
+}
diff --git a/udp_server.onyx b/udp_server.onyx
new file mode 100644 (file)
index 0000000..4e4af2b
--- /dev/null
@@ -0,0 +1,26 @@
+#load "core/std"
+
+use package core
+
+main :: (args) => {
+
+    udp_socket, err := net.socket_create(.Inet, .Dgram);
+    assert(err == .None, "Failed to create socket");
+
+    assert(udp_socket->bind(8080), "Failed to bind socket");
+
+    while true {
+        recv_buffer: [1024] u8;
+        recv_addr, recv_bytes := udp_socket->recvfrom(recv_buffer);
+
+        tmp := recv_addr->addr_as_str();
+        printf("{} sent {} bytes\n", tmp, recv_bytes);
+        string.free(tmp);
+
+        printf("{}\n", recv_buffer[0 .. recv_bytes]);
+
+        send_buffer: [1024] u8;
+        to_send := conv.format(send_buffer, "Recieved: '{}'", recv_buffer[0 .. recv_bytes]);
+        udp_socket->sendto(to_send, ^recv_addr);
+    }
+}