Question

Lorsque j'essaie de lier le port 80 à un socket en c, j'obtiens toujours l'erreur, que je n'ai pas la permission d'utiliser ce port. existe-t-il un moyen facile d'obtenir cette permission?

Était-ce utile?

La solution

Habituellement, seul le superutilisateur (racine) peut se connecter aux ports "privilégiés" (c'est-à-dire les numéros de port inférieurs à 1024).

Cela signifie que vous devez soit exécuter votre programme en tant que root, soit rendre votre exécutable 'suid root'.

Ces deux problèmes ont des conséquences en matière de sécurité. Par conséquent, vous pouvez envisager d'utiliser l'approche Suid et de renoncer aux privilèges de superutilisateur une fois l'appel lié établi.

Autres conseils

Vous trouverez ce didacticiel très utile sur la programmation réseau en C / C ++.

Et, au fait, ANSI C n’a aucun moyen d’accéder au réseau. Ce sont les bibliothèques fournies par le système d’exploitation (l’API de socket BSD, également porté sous Windows en tant que winsock ) qui offrent cette fonctionnalité.

Les ports 1024 et inférieurs sont appelés Ports privilégiés . La liaison à ces ports nécessite une autorisation élevée.

Les ports supérieurs à 1024 sont appelés Ports éphémères . La liaison à ces éléments ne nécessite aucune autorisation spéciale.

Le moyen le plus simple d'accéder aux ports privilégiés est l'utilisateur root.

Si vous êtes sur un système partagé (comme un ordinateur universitaire) et non sous root, il n'existe pas de moyen "facile" d'obtenir cette permission, à dessein.

C’est exactement ce que dit @Charles Bailey ... et j’aimerais ajouter que c’est pourquoi on voyait les adresses de serveur http sur 8080 par spécification de port dans l’URL sous la forme http: //some.url : 8080 /

Traditionnellement, seule la racine peut lier des sockets à des ports inférieurs à 1024.

La réponse de S.Lott a peut-être déclenché des réactions très négatives, mais son idée est loin d'être stupide: si la question de départ est un programme réel (pas un devoir d'école), le développer en tant qu'application derrière un serveur HTTP est souvent raisonnable. choix. De cette façon, vous pouvez laisser beaucoup de détails de bas niveau à un programme bon et bien débogué, Apache.

L'application ne doit pas nécessairement être un CGI, il peut s'agir d'un module Apache. Apache, à partir de la version 2, n'est plus simplement un serveur HTTP. C'est maintenant une plate-forme pour développer des programmes de réseau. Écrire un module Apache peut être la bonne réponse à la question initiale (voir documentation Apache . )

Les programmes normaux ne peuvent pas lier " privilégié " ports - ceux situés au-dessous de 1024. Ceci est une fonctionnalité de sécurité pour la plupart obsolète des systèmes d'exploitation de type UNIX.

Exécuter en tant que superutilisateur, bien que suggéré par beaucoup d’autres ici, est une mauvaise solution à ce problème. Si vous utilisez un système Debian ou Ubuntu, je suggère d’installer le paquet authbind , qui vous permet d'accorder à votre programme la permission d'ouvrir des ports privilégiés sans avoir à lui accorder d'autres autorisations spéciales.

Si vous utilisez un autre système, je suggère d'installer debian ou ubuntu; -).

Oui, vous pouvez facilement vous connecter au port 80. Utilisez Apache. Ecrire une application web. Apache se connecte au port 80 et exécute votre application Web.

Essayez-vous d’écrire le prochain Apache? Dans ce cas, vous devez en savoir plus sur l'appel d'API setuid dans votre système d'exploitation. système.

Si vous n'écrivez pas une nouvelle version d'Apache, la plupart des gens utilisent un port non privilégié. 8000 est populaire, il en va de 8080.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top