From 3a8ddaadf5363c9738b35b0370cffdcb34b8e21b Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 27 Mar 2022 13:48:31 -0500 Subject: [PATCH] initial commit --- doc.md | 22 ++++++++++++++++++++++ src/host.onyx | 11 +++++++++++ src/module.onyx | 10 ++++++++++ src/packet.onyx | 0 src/peer.onyx | 29 +++++++++++++++++++++++++++++ src/protocol.onyx | 0 udp_client.onyx | 43 +++++++++++++++++++++++++++++++++++++++++++ udp_server.onyx | 26 ++++++++++++++++++++++++++ 8 files changed, 141 insertions(+) create mode 100644 doc.md create mode 100644 src/host.onyx create mode 100644 src/module.onyx create mode 100644 src/packet.onyx create mode 100644 src/peer.onyx create mode 100644 src/protocol.onyx create mode 100644 udp_client.onyx create mode 100644 udp_server.onyx diff --git a/doc.md b/doc.md new file mode 100644 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 index 0000000..dfce83b --- /dev/null +++ b/src/host.onyx @@ -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 index 0000000..c07d176 --- /dev/null +++ b/src/module.onyx @@ -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 index 0000000..e69de29 diff --git a/src/peer.onyx b/src/peer.onyx new file mode 100644 index 0000000..483e941 --- /dev/null +++ b/src/peer.onyx @@ -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 index 0000000..e69de29 diff --git a/udp_client.onyx b/udp_client.onyx new file mode 100644 index 0000000..dec1e2d --- /dev/null +++ b/udp_client.onyx @@ -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 index 0000000..4e4af2b --- /dev/null +++ b/udp_server.onyx @@ -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); + } +} -- 2.25.1