#c #c #linux #sockets
#c #c #linux #сокеты
Вопрос:
У меня есть серверное приложение с прослушивающим сокетом, открытым на определенном IP-порту. Как я могу разрешить сокету разрешать входящие подключения только с одного указанного IP-адреса?
Ответ №1:
Вам придется либо использовать какое-либо программное обеспечение брандмауэра, чтобы ограничить входящие запросы к этому порту, либо отключить принятые подключения, которые вы не хотите обслуживать (на основе адреса сокета, возвращаемого accept
).).
Возможно, существуют библиотеки, которые делают это за вас, но в socket API нет ничего, что могло бы сделать это автоматически.
Ответ №2:
Когда вы принимаете соединение, вы можете проверить sockaddr после принятия, чтобы увидеть, пришло ли оно с правильного адреса. В противном случае вы немедленно закрываете сокет подключения, возвращенный accept.
Комментарии:
1. Я имею в виду принятие соединения только с однорангового узла с указанным ip-адресом!
2. @andrey: Я знаю, я неправильно истолковал ваш вопрос. Я уже изменил ответ.
3. @hackworks: Верно, но в любом случае суть спорна. Я отвечал не на тот вопрос.
4. В Win32 API есть хороший способ зарегистрировать функцию в accept. В зависимости от того, что возвращает функция, прием завершается успешно или завершается неудачей. Смотрите ссылку: msdn.microsoft.com/en-us/library/ms741513 (v = против 85).aspx
Ответ №3:
Вы должны принять соединение с помощью accept(), затем закрыть его, если оно вам не нужно (возможно, отправив ответ с ошибкой, если ваш протокол поддерживает это). Этого достаточно для большинства приложений.
Ответ №4:
Попробуйте: libauth, это надежный способ контроля доступаhttp://linux.die.net/man/3/libauth