diff options
| author | Colin Davidson <colrdavidson@gmail.com> | 2023-03-02 06:43:20 -0800 |
|---|---|---|
| committer | Colin Davidson <colrdavidson@gmail.com> | 2023-03-02 06:43:20 -0800 |
| commit | 64f200dc7419a3b1b8b4ae387d5add57b680ca3e (patch) | |
| tree | 1c05f885cb127bef5974831a74aad4b44773ab9c /core/net/socket_windows.odin | |
| parent | c02ff3af27afc013336de24570bbbaf1d66643d0 (diff) | |
big error cleanup
Diffstat (limited to 'core/net/socket_windows.odin')
| -rw-r--r-- | core/net/socket_windows.odin | 237 |
1 files changed, 0 insertions, 237 deletions
diff --git a/core/net/socket_windows.odin b/core/net/socket_windows.odin index a08248d91..ed6342316 100644 --- a/core/net/socket_windows.odin +++ b/core/net/socket_windows.odin @@ -23,16 +23,6 @@ import "core:time" Platform_Socket :: win.SOCKET -Create_Socket_Error :: enum c.int { - Network_Subsystem_Failure = win.WSAENETDOWN, - Family_Not_Supported_For_This_Socket = win.WSAEAFNOSUPPORT, - No_Socket_Descriptors_Available = win.WSAEMFILE, - No_Buffer_Space_Available = win.WSAENOBUFS, - Protocol_Unsupported_By_System = win.WSAEPROTONOSUPPORT, - Wrong_Protocol_For_Socket = win.WSAEPROTOTYPE, - Family_And_Socket_Type_Mismatch = win.WSAESOCKTNOSUPPORT, -} - @(init, private) ensure_winsock_initialized :: proc() { win.ensure_winsock_initialized() @@ -69,25 +59,6 @@ create_socket :: proc(family: Address_Family, protocol: Socket_Protocol) -> (soc } } - -Dial_Error :: enum c.int { - Port_Required = -1, - - Address_In_Use = win.WSAEADDRINUSE, - In_Progress = win.WSAEALREADY, - Cannot_Use_Any_Address = win.WSAEADDRNOTAVAIL, - Wrong_Family_For_Socket = win.WSAEAFNOSUPPORT, - Refused = win.WSAECONNREFUSED, - Is_Listening_Socket = win.WSAEINVAL, - Already_Connected = win.WSAEISCONN, - Network_Unreachable = win.WSAENETUNREACH, // Device is offline - Host_Unreachable = win.WSAEHOSTUNREACH, // Remote host cannot be reached - No_Buffer_Space_Available = win.WSAENOBUFS, - Not_Socket = win.WSAENOTSOCK, - Timeout = win.WSAETIMEDOUT, - Would_Block = win.WSAEWOULDBLOCK, // TODO: we may need special handling for this; maybe make a socket a struct with metadata? -} - dial_tcp_from_endpoint :: proc(endpoint: Endpoint, options := default_tcp_options) -> (skt: TCP_Socket, err: Network_Error) { if endpoint.port == 0 { err = .Port_Required @@ -117,21 +88,6 @@ dial_tcp_from_endpoint :: proc(endpoint: Endpoint, options := default_tcp_option return } -Bind_Error :: enum c.int { - // Another application is currently bound to this endpoint. - Address_In_Use = win.WSAEADDRINUSE, - // The address is not a local address on this machine. - Given_Nonlocal_Address = win.WSAEADDRNOTAVAIL, - // To bind a UDP socket to the broadcast address, the appropriate socket option must be set. - Broadcast_Disabled = win.WSAEACCES, - // The address family of the address does not match that of the socket. - Address_Family_Mismatch = win.WSAEFAULT, - // The socket is already bound to an address. - Already_Bound = win.WSAEINVAL, - // There are not enough ephemeral ports available. - No_Ports_Available = win.WSAENOBUFS, -} - bind :: proc(skt: Any_Socket, ep: Endpoint) -> (err: Network_Error) { sockaddr := endpoint_to_sockaddr(ep) s := any_socket_to_socket(skt) @@ -165,18 +121,6 @@ make_bound_udp_socket :: proc(bound_address: Address, port: int) -> (skt: UDP_So return } - - -Listen_Error :: enum c.int { - Address_In_Use = win.WSAEADDRINUSE, - Already_Connected = win.WSAEISCONN, - No_Socket_Descriptors_Available = win.WSAEMFILE, - No_Buffer_Space_Available = win.WSAENOBUFS, - Nonlocal_Address = win.WSAEADDRNOTAVAIL, - Not_Socket = win.WSAENOTSOCK, - Listening_Not_Supported_For_This_Socket = win.WSAEOPNOTSUPP, -} - listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (skt: TCP_Socket, err: Network_Error) { assert(backlog > 0 && i32(backlog) < max(i32)) @@ -199,17 +143,6 @@ listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (skt: TCP_S return } - - -Accept_Error :: enum c.int { - Not_Listening = win.WSAEINVAL, - No_Socket_Descriptors_Available_For_Client_Socket = win.WSAEMFILE, - No_Buffer_Space_Available = win.WSAENOBUFS, - Not_Socket = win.WSAENOTSOCK, - Not_Connection_Oriented_Socket = win.WSAEOPNOTSUPP, - Would_Block = win.WSAEWOULDBLOCK, // TODO: we may need special handling for this; maybe make a socket a struct with metadata? -} - accept_tcp :: proc(sock: TCP_Socket, options := default_tcp_options) -> (client: TCP_Socket, source: Endpoint, err: Network_Error) { for { sockaddr: win.SOCKADDR_STORAGE_LH @@ -236,30 +169,12 @@ accept_tcp :: proc(sock: TCP_Socket, options := default_tcp_options) -> (client: } } - - close :: proc(skt: Any_Socket) { if s := any_socket_to_socket(skt); s != {} { win.closesocket(Platform_Socket(s)) } } - - -TCP_Recv_Error :: enum c.int { - Network_Subsystem_Failure = win.WSAENETDOWN, - Not_Connected = win.WSAENOTCONN, - Bad_Buffer = win.WSAEFAULT, - Keepalive_Failure = win.WSAENETRESET, - Not_Socket = win.WSAENOTSOCK, - Shutdown = win.WSAESHUTDOWN, - Would_Block = win.WSAEWOULDBLOCK, - Aborted = win.WSAECONNABORTED, // TODO: not functionally different from Reset; merge? - Timeout = win.WSAETIMEDOUT, - Connection_Closed = win.WSAECONNRESET, // TODO(tetra): Determine when this is different from the syscall returning n=0 and maybe normalize them? - Host_Unreachable = win.WSAEHOSTUNREACH, // TODO: verify can actually happen -} - recv_tcp :: proc(skt: TCP_Socket, buf: []byte) -> (bytes_read: int, err: Network_Error) { if len(buf) <= 0 { return @@ -272,32 +187,6 @@ recv_tcp :: proc(skt: TCP_Socket, buf: []byte) -> (bytes_read: int, err: Network return int(res), nil } -UDP_Recv_Error :: enum c.int { - Network_Subsystem_Failure = win.WSAENETDOWN, - Aborted = win.WSAECONNABORTED, // TODO: not functionally different from Reset; merge? - // UDP packets are limited in size, and the length of the incoming message exceeded it. - Truncated = win.WSAEMSGSIZE, - // The machine at the remote endpoint doesn't have the given port open to receiving UDP data. - Remote_Not_Listening = win.WSAECONNRESET, - Shutdown = win.WSAESHUTDOWN, - // A broadcast address was specified, but the .Broadcast socket option isn't set. - Broadcast_Disabled = win.WSAEACCES, - Bad_Buffer = win.WSAEFAULT, - No_Buffer_Space_Available = win.WSAENOBUFS, - // The socket is not valid socket handle. - Not_Socket = win.WSAENOTSOCK, - Would_Block = win.WSAEWOULDBLOCK, - // The remote host cannot be reached from this host at this time. - Host_Unreachable = win.WSAEHOSTUNREACH, - // The network cannot be reached from this host at this time. - Offline = win.WSAENETUNREACH, - Timeout = win.WSAETIMEDOUT, - // The socket isn't bound; an unknown flag specified; or MSG_OOB specified with SO_OOBINLINE enabled. - Incorrectly_Configured = win.WSAEINVAL, // TODO: can this actually happen? - // The message took more hops than was allowed (the Time To Live) to reach the remote endpoint. - TTL_Expired = win.WSAENETRESET, -} - recv_udp :: proc(skt: UDP_Socket, buf: []byte) -> (bytes_read: int, remote_endpoint: Endpoint, err: Network_Error) { if len(buf) <= 0 { return @@ -318,31 +207,6 @@ recv_udp :: proc(skt: UDP_Socket, buf: []byte) -> (bytes_read: int, remote_endpo recv :: proc{recv_tcp, recv_udp} - -// -// TODO: consider merging some errors to make handling them easier -// TODO: verify once more what errors to actually expose -// - -TCP_Send_Error :: enum c.int { - Aborted = win.WSAECONNABORTED, // TODO: not functionally different from Reset; merge? - Not_Connected = win.WSAENOTCONN, - Shutdown = win.WSAESHUTDOWN, - Connection_Closed = win.WSAECONNRESET, - No_Buffer_Space_Available = win.WSAENOBUFS, - Network_Subsystem_Failure = win.WSAENETDOWN, - Host_Unreachable = win.WSAEHOSTUNREACH, - Offline = win.WSAENETUNREACH, // TODO: verify possible, as not mentioned in docs - Timeout = win.WSAETIMEDOUT, - // A broadcast address was specified, but the .Broadcast socket option isn't set. - Broadcast_Disabled = win.WSAEACCES, - Bad_Buffer = win.WSAEFAULT, - // Connection is broken due to keepalive activity detecting a failure during the operation. - Keepalive_Failure = win.WSAENETRESET, // TODO: not functionally different from Reset; merge? - // The so-called socket is not an open socket. - Not_Socket = win.WSAENOTSOCK, -} - // Repeatedly sends data until the entire buffer is sent. // If a send fails before all data is sent, returns the amount // sent up to that point. @@ -360,36 +224,6 @@ send_tcp :: proc(skt: TCP_Socket, buf: []byte) -> (bytes_written: int, err: Netw return } -UDP_Send_Error :: enum c.int { - Network_Subsystem_Failure = win.WSAENETDOWN, - Aborted = win.WSAECONNABORTED, // TODO: not functionally different from Reset; merge? - // UDP packets are limited in size, and len(buf) exceeded it. - Message_Too_Long = win.WSAEMSGSIZE, - // The machine at the remote endpoint doesn't have the given port open to receiving UDP data. - Remote_Not_Listening = win.WSAECONNRESET, - Shutdown = win.WSAESHUTDOWN, - // A broadcast address was specified, but the .Broadcast socket option isn't set. - Broadcast_Disabled = win.WSAEACCES, - Bad_Buffer = win.WSAEFAULT, - // Connection is broken due to keepalive activity detecting a failure during the operation. - Keepalive_Failure = win.WSAENETRESET, // TODO: not functionally different from Reset; merge? - No_Buffer_Space_Available = win.WSAENOBUFS, - // The socket is not valid socket handle. - Not_Socket = win.WSAENOTSOCK, - // This socket is unidirectional and cannot be used to send any data. - // TODO: verify possible; decide whether to keep if not - Receive_Only = win.WSAEOPNOTSUPP, - Would_Block = win.WSAEWOULDBLOCK, - // The remote host cannot be reached from this host at this time. - Host_Unreachable = win.WSAEHOSTUNREACH, - // Attempt to send to the Any address. - Cannot_Use_Any_Address = win.WSAEADDRNOTAVAIL, - // The address is of an incorrect address family for this socket. - Family_Not_Supported_For_This_Socket = win.WSAEAFNOSUPPORT, - // The network cannot be reached from this host at this time. - Offline = win.WSAENETUNREACH, - Timeout = win.WSAETIMEDOUT, -} // Sends a single UDP datagram packet. // @@ -413,24 +247,6 @@ send_udp :: proc(skt: UDP_Socket, buf: []byte, to: Endpoint) -> (bytes_written: send :: proc{send_tcp, send_udp} - - - -Shutdown_Manner :: enum c.int { - Receive = win.SD_RECEIVE, - Send = win.SD_SEND, - Both = win.SD_BOTH, -} - -Shutdown_Error :: enum c.int { - Aborted = win.WSAECONNABORTED, - Reset = win.WSAECONNRESET, - Offline = win.WSAENETDOWN, - Not_Connected = win.WSAENOTCONN, - Not_Socket = win.WSAENOTSOCK, - Invalid_Manner = win.WSAEINVAL, -} - shutdown :: proc(skt: Any_Socket, manner: Shutdown_Manner) -> (err: Network_Error) { s := any_socket_to_socket(skt) res := win.shutdown(Platform_Socket(s), c.int(manner)) @@ -440,59 +256,6 @@ shutdown :: proc(skt: Any_Socket, manner: Shutdown_Manner) -> (err: Network_Erro return } - - - -Socket_Option :: enum c.int { - // bool: Whether the address that this socket is bound to can be reused by other sockets. - // This allows you to bypass the cooldown period if a program dies while the socket is bound. - Reuse_Address = win.SO_REUSEADDR, - // bool: Whether other programs will be inhibited from binding the same endpoint as this socket. - Exclusive_Addr_Use = win.SO_EXCLUSIVEADDRUSE, - // bool: When true, keepalive packets will be automatically be sent for this connection. - // TODO: verify this understanding - Keep_Alive = win.SO_KEEPALIVE, - // bool: When true, client connections will immediately be sent a TCP/IP RST response, rather than - // being accepted. - Conditional_Accept = win.SO_CONDITIONAL_ACCEPT, - // bool: If true, when the socket is closed, but data is still waiting to be sent, discard that data. - Dont_Linger = win.SO_DONTLINGER, - // bool: When true, 'out-of-band' data sent over the socket will be read by a normal net.recv() call, - // the same as normal 'in-band' data. - Out_Of_Bounds_Data_Inline = win.SO_OOBINLINE, - // bool: When true, disables send-coalescing, therefore reducing latency. - TCP_Nodelay = win.TCP_NODELAY, - // win.LINGER: Customizes how long (if at all) the socket will remain open when there is some remaining data - // waiting to be sent, and net.close() is called. - Linger = win.SO_LINGER, - // win.DWORD: The size, in bytes, of the OS-managed receive-buffer for this socket. - Receive_Buffer_Size = win.SO_RCVBUF, - // win.DWORD: The size, in bytes, of the OS-managed send-buffer for this socket. - Send_Buffer_Size = win.SO_SNDBUF, - // win.DWORD: For blocking sockets, the time in milliseconds to wait for incoming data to be received, before giving up and returning .Timeout. - // For non-blocking sockets, ignored. - // Use a value of zero to potentially wait forever. - Receive_Timeout = win.SO_RCVTIMEO, - // win.DWORD: For blocking sockets, the time in milliseconds to wait for outgoing data to be sent, before giving up and returning .Timeout. - // For non-blocking sockets, ignored. - // Use a value of zero to potentially wait forever. - Send_Timeout = win.SO_SNDTIMEO, - // bool: Allow sending to, receiving from, and binding to, a broadcast address. - Broadcast = win.SO_BROADCAST, -} - -Socket_Option_Error :: enum c.int { - Linger_Only_Supports_Whole_Seconds = 1, - // The given value is too big or small to be given to the OS. - Value_Out_Of_Range, - - Network_Subsystem_Failure = win.WSAENETDOWN, - Timeout_When_Keepalive_Set = win.WSAENETRESET, - Invalid_Option_For_Socket = win.WSAENOPROTOOPT, - Reset_When_Keepalive_Set = win.WSAENOTCONN, - Not_Socket = win.WSAENOTSOCK, -} - set_option :: proc(s: Any_Socket, option: Socket_Option, value: any, loc := #caller_location) -> Network_Error { level := win.SOL_SOCKET if option != .TCP_Nodelay else win.IPPROTO_TCP |