Вопрос

Когда я пытаюсь привязать порт 80 к сокету в c, я всегда получаю сообщение об ошибке, что у меня нет разрешения на использование этого порта. Есть ли простой способ получить это разрешение?

Это было полезно?

Решение

Обычно только суперпользователь (root) может связываться с «привилегированными» портами (то есть с номерами портов ниже 1024).

Это означает, что вы должны либо запустить программу от имени пользователя root, либо сделать исполняемый файл 'suid root'.

Оба эти варианта имеют последствия для безопасности, поэтому вы можете рассмотреть возможность использования подхода suid и отказа от привилегий суперпользователя после выполнения вызова bind.

Другие советы

этот учебник будет очень полезен для сетевого программирования на C / C ++.

И, между прочим, ANSI C не имеет доступа к сети. Именно предоставляемые ОС библиотеки (API сокетов BSD, также портированные на Windows как winsock ) обеспечивают эту возможность.

Порты 1024 и ниже называются Привилегированные порты , для привязки к этим портам требуется повышенное разрешение.

Порты выше 1024 называются Эмпемеральными портами . Привязка к ним не требует специальных разрешений.

Самый простой способ получить доступ к привилегированным портам - это быть пользователем root.

Если вы работаете в общедоступной системе (например, в университете) и не являетесь пользователем root, то у вас нет «простого» способа получить это разрешение с помощью дизайна.

Это так же, как @Charles Bailey, и я хотел бы добавить, что именно поэтому раньше адреса http-серверов на 8080 по спецификации порта в URL-адресе указывались как http: //some.url : 8080 /

Традиционно только root может связывать сокеты с портами до 1024.

Ответ С. Лотта, возможно, вызвал очень негативные реакции, но его идея далека от глупости: если исходный вопрос касается реальной программы (а не школьного задания), разработка его в качестве приложения за HTTP-сервером часто является разумной выбор. Таким образом, вы можете оставить много низкоуровневых деталей для хорошей и хорошо отлаженной программы Apache.

Приложение не обязательно должно быть CGI, это может быть модуль Apache. Apache, начиная с версии 2, больше не является просто HTTP-сервером. Сейчас это платформа для разработки сетевых программ. Написание модуля Apache может быть правильным ответом на исходный вопрос (см. документацию Apache . )

Обычные программы не могут связывать " привилегированные " порты - те, что ниже 1024. Это в основном устаревшая функция безопасности UNIX-подобных операционных систем.

Работа в качестве суперпользователя, хотя и предлагается многими другими здесь, является плохим решением этой проблемы. Если вы работаете в системе Debian или Ubuntu, я предлагаю установить пакет authbind , который будет позволяют вам разрешить программе открывать привилегированные порты, не предоставляя программе никаких других специальных разрешений.

Если вы работаете в любой другой системе, я предлагаю установить Debian или Ubuntu; -).

Да, вы можете легко подключиться к порту 80. Используйте Apache. Написать веб-приложение. Apache подключается к порту 80 и запускает ваше веб-приложение.

Вы пытаетесь написать следующий Apache? Если это так, вам нужно будет узнать о вызове API setuid в вашей операционной системе. система.

Если вы не пишете новую версию Apache, большинство людей используют непривилегированный порт. 8000 популярно, так же как 8080.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top