Привязка сокета к порту 80 в ответ - PullRequest
8 голосов
/ 04 октября 2008

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

Ответы [ 9 ]

17 голосов
/ 04 октября 2008

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

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

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

4 голосов
/ 04 октября 2008

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

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

3 голосов
/ 04 октября 2008

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

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

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

0 голосов
/ 16 октября 2008

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

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

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

0 голосов
/ 05 октября 2008

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

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

0 голосов
/ 04 октября 2008

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

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

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

0 голосов
/ 04 октября 2008

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

0 голосов
/ 04 октября 2008

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

0 голосов
/ 04 октября 2008

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

...