| ▲ | antonvs an hour ago | |||||||
It may be memory safe but it's not using the type system to represent the domain very well. One could imagine a more type-friendly design in which we could write that first line as follows:
Now, the specifics of socket types will be statically checked.Edit: I realized that the issue here is actually the conversion, and that UdpSocket on its own is actually a type-safe representation of a UDP socket, not a general datagram socket. But the fact that this dubiously-safe conversion is possible and even useful suggests that an improved design is possible. For example, a method like UdpSocket's `set_broadcast` can't work with a socket like the above, and from a type safety perspective, it shouldn't be possible to call it on such a socket. | ||||||||
| ▲ | knorker a few seconds ago | parent | next [-] | |||||||
> dubiously-safe No, it's perfectly safe. Except if you expand the scope of "safe" by a lot. OP turned the socket into an (almost) raw file descriptor, and created an UDP socket from it. Weird, yes, but since it's perfectly memory safe and invalid operations would correctly error, it's not "dubiously-safe". It's safe. I mean, either your language has the ability to do raw (technically Owned in this case) file descriptors, or it doesn't. Maybe you'd prefer Rust had a third mode? Safe, `unsafe {}`, and `are_you_sure_you_understand_this {}`, the last one also being 'safe', but just… odd. | ||||||||
| ▲ | scottlamb an hour ago | parent | prev [-] | |||||||
One could, but one probably doesn't want to have separate types for TCP-over-IPv4 vs TCP-over-IPv6 for example, even if they accept/produce different forms of addresses. That'd force a lot of code bloat with monomorphization. So now one is making one's own enumeration which is different than the OS one and mapping between them, which can get into a mess of all the various protocols Linux and other OSs support, and I'm not sure it's solving a major problem. Opinions vary, but I prefer to use complex types sparingly. I think there are likely a bunch of other cases where it's useful to choose these values more dynamically too. Networking gets weird! | ||||||||
| ||||||||