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





Обычно только суперпользователь (root) может связываться с «привилегированными» портами (то есть с номерами портов ниже 1024).
Это означает, что вы должны либо запускать свою программу от имени пользователя root, либо сделать свой исполняемый файл «suid root».
Оба они имеют последствия для безопасности, поэтому вы можете рассмотреть возможность использования подхода suid и отказа от привилегий суперпользователя после выполнения вызова привязки.
Если вы используете общую систему (например, университетский компьютер) и не пользуетесь root-правами, то не существует «простого» способа получить это разрешение по своей задумке.
Вы найдете этот учебник очень полезным при сетевом программировании на C / C++.
И, кстати, ANSI C не имеет доступа к сети. Эту возможность предоставляют библиотеки, поставляемые ОС (API сокетов BSD, также перенесенный в Windows как winsock).
Руководство Биджа по сокетам - это то, чему я научился программировать сокеты в университете вместе с поколениями других студентов-информатиков. Это действительно хорошо. Также работы У. Ричарда Стивенса являются хорошим руководством в этой области.
Да, хотя чтение руководств Биджа занимает значительно меньше времени, чем библии Стивенса :-)
Это то же самое, что сказал @Charles Bailey ... и я хотел бы добавить, что именно поэтому на 8080 адреса http-серверов по спецификации порта в URL-адресе отображались как http: //some.url: 8080 /
Традиционно только root может привязывать сокеты к портам ниже 1024.
Порты 1024 и ниже называются Привилегированные порты, привязка к этим портам требует повышенных разрешений.
Порты выше 1024 называются Emphemeral Порты. Для привязки к ним не требуется специальных разрешений.
Самый простой способ получить доступ к привилегированным портам - быть пользователем root.
Да, вы можете легко привязаться к порту 80. Используйте Apache. Напишите веб-приложение. Apache привязывается к порту 80 и запускает ваше веб-приложение.
Вы пытаетесь написать следующий Apache? Если это так, вам необходимо узнать о вызове API Setuid в вашей операционной системе.
Если вы не пишете новую версию Apache, большинство людей используют непривилегированный порт. 8000 популярен, так что 8080.
Ответ С.Лотта, возможно, вызвал очень негативную реакцию, но его идея отнюдь не глупа: если исходный вопрос касается реальной программы (а не школьного задания), то разработка ее как приложения на базе HTTP-сервера часто оказывается разумным выбором. Таким образом, вы можете оставить много низкоуровневых деталей хорошей и хорошо отлаженной программе Apache.
Приложение не обязательно должно быть CGI, это может быть модуль Apache. Apache, начиная с версии 2, больше не является просто HTTP-сервером. Теперь это платформа для разработки сетевых программ. Написание модуля Apache может быть правильным ответом на исходный вопрос (см. Документация Apache)
Спасибо. Мне потребовалось время, чтобы узнать Почему, что есть привилегированные порты. Это связано с ожиданиями - вы ожидаете, что протокол http будет на 80-м порту, и уже есть хорошая программа для обработки этого протокола за вас.
Обычные программы не могут связывать «привилегированные» порты - порты ниже 1024. Это в основном устаревшая функция безопасности UNIX-подобных операционных систем.
Запуск от имени суперпользователя, хотя и предлагается здесь многими другими, - плохое решение этой проблемы. Если вы работаете в системе Debian или Ubuntu, я предлагаю установить пакет authbind, который позволит вам предоставить вашей программе разрешение на открытие привилегированных портов без необходимости предоставлять вашей программе какие-либо другие специальные разрешения.
Если вы работаете в любой другой системе, я предлагаю установить debian или ubuntu ;-).
Порты 1024 и ниже на самом деле называются «привилегированными портами», а не «безопасными портами», все, что выше 1024, является «временными портами». Ваше здоровье.