Привязка сокета к порту 80 в ansi c

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
5 794
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

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

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

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

Порты 1024 и ниже на самом деле называются «привилегированными портами», а не «безопасными портами», все, что выше 1024, является «временными портами». Ваше здоровье.

paxos1977 04.10.2008 02:29

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

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

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

Руководство Биджа по сокетам - это то, чему я научился программировать сокеты в университете вместе с поколениями других студентов-информатиков. Это действительно хорошо. Также работы У. Ричарда Стивенса являются хорошим руководством в этой области.

ConcernedOfTunbridgeWells 04.10.2008 02:35

Да, хотя чтение руководств Биджа занимает значительно меньше времени, чем библии Стивенса :-)

Eli Bendersky 04.10.2008 02:42

Это то же самое, что сказал @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-м порту, и уже есть хорошая программа для обработки этого протокола за вас.

S.Lott 05.10.2008 03:09

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

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

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

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