Pregunta

Cuando intento vincular el puerto 80 a un zócalo en c, siempre recibo el error de que no tengo permiso para usar este puerto. ¿hay una manera fácil de obtener este permiso?

¿Fue útil?

Solución

Por lo general, solo el superusuario (root) puede unirse a puertos 'privilegiados' (es decir, los números de puerto inferiores a 1024).

Esto significa que tienes que ejecutar tu programa como root o hacer que tu ejecutable sea 'suid root'.

Ambos tienen consecuencias de seguridad, por lo que es posible que desee considerar usar el enfoque suid y renunciar a los privilegios de superusuario una vez que se haya realizado la llamada de enlace.

Otros consejos

Encontrará este tutorial muy útil en la programación de redes con C / C ++.

Y, por cierto, ANSI C no tiene forma de acceder a la red. Son las bibliotecas suministradas por el sistema operativo (la API de socket BSD, también portada a Windows como winsock ) las que proporcionan esta capacidad.

Los

puertos 1024 e inferiores se denominan puertos privilegiados , el enlace a estos puertos requiere un permiso elevado.

Los

puertos superiores a 1024 se denominan Puertos intermedios . La vinculación a estos no requiere permisos especiales.

La forma más fácil de obtener acceso a puertos privilegiados es ser el usuario root.

Si estás en un sistema compartido (como una computadora de la universidad) y no eres root, no hay una forma 'fácil' de obtener ese permiso, por diseño.

Es justo como @Charles Bailey lo pone ... y me gustaría agregar que esta es la razón por la que uno solía ver las direcciones del servidor http en 8080 por especificación de puerto en la URL como http: //some.url : 8080 /

Tradicionalmente, solo la raíz puede enlazar sockets a puertos menores de 1024.

La respuesta de S.Lott puede haber desencadenado reacciones muy negativas, pero su idea está lejos de ser estúpida: si la pregunta original es para un programa real (no una tarea escolar), desarrollarlo como una aplicación detrás de un servidor HTTP a menudo es razonable elección. De esa manera, puede dejar muchos detalles de bajo nivel a un programa bueno y bien depurado, Apache.

La aplicación no tiene que ser un CGI, puede ser un módulo Apache. Apache, de la versión 2, ya no es solo un servidor HTTP. Ahora es una plataforma para desarrollar programas de red. Escribir un módulo de Apache puede ser la respuesta correcta a la pregunta original (consulte documentación de Apache )

Los programas normales no pueden enlazar " privilegiado " Puertos: aquellos por debajo de 1024. Esta es una función de seguridad en su mayoría obsoleta de los sistemas operativos similares a UNIX.

Ejecutarse como superusuario, aunque es sugerido por muchos otros aquí, es una mala solución a este problema. Si está ejecutando en un sistema Debian o Ubuntu, sugiero instalar el paquete authbind , que será le permite otorgar a su programa permiso para abrir puertos privilegiados sin tener que otorgarle a su programa ningún otro permiso especial.

Si está ejecutando en cualquier otro sistema, sugiero que instale debian o ubuntu ;-).

Sí, puede enlazar fácilmente al puerto 80. Use Apache. Escribe una aplicación web. Apache se une al puerto 80 y ejecuta su aplicación web.

¿Estás tratando de escribir el próximo Apache? Si es así, deberá conocer la setuid llamada API en su operación sistema.

Si no está escribiendo una nueva versión de Apache, la mayoría de la gente usa un puerto sin privilegios. 8000 es popular, también lo es 8080.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top