En testant, je peux voir qu'il est possible pour un utilisateur de MacOS de bureau de lier() des numéros de port TCP inférieurs à 1024 (les ports dits bien connus). Cela fonctionne à la fois sur IPv4 et IPv6, et sur les adresses localhost/non spécifiées.
Le code source du noyau Darwin est librement disponible - à partir de là, je peux voir qu'il a la fonctionnalité intégrée pour vérifier les processus essayant de se lier/écouter sur les ports <1024 et de les refuser. Ceci est similaire à la façon dont Linux fonctionne. Cependant, il est possible de désactiver cette vérification lors de la compilation du noyau en définissant "IPNOPRIVPORTS". Je suppose que c'est ce qui a été fait avec le noyau fourni par Mojave.
Sous Linux, il était autrefois impossible pour les utilisateurs non-Root de se lier à des ports à faible numérotation, mais aujourd'hui vous disposez de plusieurs options pour permettre aux utilisateurs non-Root de se lier à des ports à faible numérotation. Comme par exemple l'utilisation de la capacité NET_BIND_SERVICE.
Sous MacOS, vous disposez également de plusieurs options pour restreindre la liaison des ports à faible numérotation. Par exemple par le biais de kexts qui fait du filtrage de socket, ou par d'autres moyens. Il se peut que vous ayez installé un logiciel, comme par exemple Little Snitch, qui vous a refusé la permission lors de vos tests.
Veuillez noter que les différentes adresses IP que vous avez essayées ont des significations totalement différentes :
127.0.0.1 = IPv4 address that means the "localhost" (i.e. your own computer basically) - it is not available on the network
[::1] = the IPv6 equivalent of 127.0.0.1
0.0.0.0 = IPv4 "unspecified address" - i.e. this is not an address in itself, rather it is a special value you give to bind() to let it know that you haven't specified a specific address that you want the port bind() on. Essentially this means that the port will be bound on all the IP-addresses you have.
[::0] = IPv6 equivalent of 0.0.0.0 (though usually written [::/128])
Cela peut expliquer pourquoi certaines choses ont échoué et d'autres ont réussi. Par exemple, il se peut que vous ne puissiez pas vous lier à 127.0.0.1, mais que 0.0.0.0 fonctionne car il essaie de lier le port non seulement à 127.0.0.1 mais aussi à d'autres adresses IP que vous avez.