Я изучаю программирование сокетов на С++... Программа сервера привязывается к сокету и начинает прослушивать запросы на подключение... хорошо, теперь как я могу перечислить IP-адреса прослушанных запросов? Я знаю, что могу получить IP-адреса после принятия соединений, но скажем, я не хочу принимать соединение с определенного IP-адреса...
Как получить IP-адрес клиента перед принятием соединения в С++
Ответы (3)
Для оптимальной производительности это может быть решено путем фильтрации в сетевом стеке, но детали этого будут зависеть от операционной системы (это не часть интерфейса сокета, и ваше приложение может вообще не иметь прав на настройку вашей сети). складывайте таким образом.)
Другая возможность — после accept
, когда соединение уже принято (CONNECT ACK) на уровне TCP.
Я не думаю, что вы можете сделать это в средней фазе, где вы бы предпочли это. Это, однако, не сильно отличается от того, чтобы сделать это после accept
в любом случае.
accept
никому не дает никаких новых прав. Это просто позволяет получить доступ к отдельному соединению на вашей стороне через API сокетов. Другая сторона относительно мало может вам навредить; атака типа «отказ в обслуживании» или обнаружение того, что ваш порт открыт. Но они могли бы сделать то же самое, даже если бы вы не согласились. Вы не можете имитировать брандмауэр на уровне приложения.
- person Jirka Hanika; 24.05.2012
Только в Windows вы можете использовать функцию условного обратного вызова WinSock2 WSAAccept()
для доступа к информации о клиенте перед принятием соединения и даже для отклонения соединения до того, как оно будет принято.
Это невозможно сделать с точки зрения стандартного API сокетов. На всех известных мне платформах система фактически принимает соединение (т. е. отвечает TCP-дейтаграммой SYN+ACK) прежде, чем приложение получает возможность отслеживать ожидающий запрос.