#load "core/std"
-#load "./../src/module"
+#load "./../module"
use package core
onyx_net :: package onyx_net
input_thread: thread.Thread;
thread.spawn(^input_thread, peer, (peer) => {
- input_reader := io.reader_make(^stdin);
+ input_reader := io.reader_make(^stdio_stream);
while true {
line := io.read_line(^input_reader) |> string.strip_whitespace();
onyx_net.peer_send_disconnect(peer);
onyx_net.peer_flush_outgoing_commands(peer);
onyx_net.peer_disconnect(peer);
- break;
+ break break;
}
case "send" {
package onyx_net
-@CLEANUP
+// @CLEANUP
use package core
Host :: struct {
defer if errored do net.socket_close(^host.socket);
if addr != null {
- if !host.socket->bind(addr.port) {
+ sa: net.Socket_Address;
+ net.make_ipv4_address(^sa, 0, addr.port);
+ if !(host.socket->bind(^sa)) {
errored = true;
return null, .Socket_Binding_Failed;
}
host.current_time = ~~ (os.time() & cast(u64) 0xFFFFFFFF);
for^ peer: host.peers {
- memory.set(peer, 0, sizeof typeof *peer);
peer.host = host;
peer.state = .Disconnected;
peer.channels = .{ null, 0 };
host_receive_commands :: (host: ^Host, timeout: u32 = 0) -> bool {
if timeout > 0 {
check_sockets := (^net.Socket).[ ^host.socket ];
- changed_buffer := alloc.array_from_stack(i32, 1);
- changed := net.socket_poll_all(check_sockets, timeout, changed_buffer);
+ changed_buffer := alloc.array_from_stack(net.Socket_Poll_Status, 1);
+ net.socket_poll_all(check_sockets, timeout, changed_buffer);
- if changed.count == 0 do return false;
+ if changed_buffer[0] == .No_Change do return false;
}
buffer: [] u8 = host.packet_data[0];
- recv_addr, recv_bytes := host.socket ->recvfrom(buffer);
+ recv_addr, recv_bytes := host.socket->recvfrom(buffer);
host.received_addr = recv_addr;
host.received_data = buffer[0 .. recv_bytes];
}
defer string.advance(data, data_length);
- @CopyPaste
+ // @CopyPaste
channel := ^peer.channels[command.channel];
for channel.reliable_windows {
if command.seq_number == it do return;
channel.reliable_windows_cursor %= channel.reliable_windows.count;
fragment_id := net.network_to_host(command.fragment_id);
- fragment: ^Fragmented_Data = null;
- for^ channel.pending_fragments {
- if it.fragment_id == fragment_id {
- fragment = it;
- break;
- }
- }
+ fragment: ^Fragmented_Data = array.first(channel.pending_fragments, #(it.fragment_id == fragment_id));
if fragment == null {
fragment = array.alloc_one(^channel.pending_fragments);
}
-@Relocate
+// @Relocate
Event :: struct {
Type :: enum {
None;