use package core
-/*
- Desired API for working with networking.
-
- // Client
- s, err := net.socket_create(.Inet, .Stream);
- if err != .None {
- // Error handling
- }
- s->connect("10.0.0.1", 9001);
-
- net.socket_send(s, "message");
- msg := net.socket_recv(s, allocator=context.allocator); // Allocates the result
-
- // with aliases for "methods"
-
- s->send("message");
- msg := s->recv(1024);
-
-
-
- // Server (single client)
- s, err := net.socket_create(.Inet, .Stream);
- if err != .None { / ... / }
-
- s->bind(9001);
- if !s->listen() { // error }
-
- client, addr := s->accept();
- while true {
- msg := s->recv(1024);
- if msg.count > 0 {
- s->send(msg);
- }
- }
-*/
-
Socket :: struct {
Handle :: #distinct i32
#foreign "onyx_runtime" {
__net_create_socket :: (out_handle: ^Socket.Handle, domain: SocketDomain, type: SocketType) -> SocketError ---
- __net_close_socket :: (handle: Socket.Handle) -> void ---
- __net_bind :: (handle: Socket.Handle, port: u16) -> bool ---
+ __net_close_socket :: (handle: Socket.Handle) -> void ---
+ __net_bind :: (handle: Socket.Handle, port: u16) -> bool ---
__net_listen :: (handle: Socket.Handle, backlog: i32) -> void ---
- __net_accept :: (handle: Socket.Handle) -> Socket.Handle --- // This should also return the address, but in what format?
+ __net_accept :: (handle: Socket.Handle) -> Socket.Handle --- // This should also return the address, but in what format?
__net_connect :: (handle: Socket.Handle, host: str, port: u16) -> SocketError ---
- __net_send :: (handle: Socket.Handle, data: [] u8) -> u32 ---
- __net_recv :: (handle: Socket.Handle, data: [] u8) -> u32 ---
+ __net_send :: (handle: Socket.Handle, data: [] u8) -> u32 ---
+ __net_recv :: (handle: Socket.Handle, data: [] u8) -> u32 ---
}
#local {
}
socket_sendall :: (s: ^Socket, data: [] u8) {
+ to_send := data;
+
+ while to_send.count > 0 {
+ sent := __net_send(s.handle, to_send);
+ to_send = to_send[sent .. to_send.count];
+ }
}
socket_recv :: (s: ^Socket, maxlen := 1024, allocator := context.allocator) -> [] u8 {