3 ms·
... and annoying casting from `sockaddr` to either `sockaddr_in` or `sockaddr_in6*` while you pass around a socklen_t. 10 years ago I was all gung-ho about IPv
by Chu4eeno 7mo ago
... and annoying casting from `sockaddr` to either `sockaddr_in` or `sockaddr_in6*` while you pass around a socklen_t.
10 years ago I was all gung-ho about IPv6, but it's annoying at every level.
- tonymet 7mo agoHaving 2 sockets for loopback or multiple interfaces is a huge pain
- BenjiWiebe 7mo agoBind to '::' and you can get v4 and v6 traffic on one socket.
- tonymet 7mo agoDoesn’t work for loopback (you have to listen externally )
- vimredo 7mo agoIt works fine for me on NixOS (Linux), with a recent kernel version and no weird config options - or at least I think so.
- IcePic 7mo agoNot on all OSes. And it's not all good to have one less socket, there are still issues with people not expecting v4 traffic on a v6-capable socket, like described here: https://radar.offseq.com/threat/ipv4-mapped-ipv6-addresses-tue-mar-17th-d7adc16f https://radar.offseq.com/threat/ipv4-mapped-ipv6-addresses-t... If you want to handle two protocols, it is not unreasonable to use two sockets.
- Dagger2 7mo agoWhy are you casting to sockaddr_in/6? The whole point of that system is that you can just pass around the sockaddr* without even needing to have a definition for sockaddr_in or sockaddr_in6. All of the socket API functions accept sockaddr*, and if you need to get the IP or port out then you use getnameinfo(), which also takes sockaddr*. There should be little reason to ever cast to either of those types in normal use. (I can think of one or two cases where you might, but they're not common.) Having to deal with the separate socklen_t is mildly annoying, but you can just make a little struct that holds both.