--- /dev/null
+# 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.
+
+
+
--- /dev/null
+package onyx_net
+
+Host :: struct {
+ socket : net.Socket;
+ addr : net.Socket_Address;
+
+ peers : [] Peer;
+ maximum_peers: u32;
+}
+
+
--- /dev/null
+package onyx_net
+
+#package {
+ array :: package core.array
+ net :: package core.net
+ list :: package core.list
+ alloc :: package core.alloc
+}
+
+#load_all "./."
--- /dev/null
+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;
+
+}
--- /dev/null
+#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]);
+ }
+}
--- /dev/null
+#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);
+ }
+}