Как получить IP-адрес клиента перед принятием соединения в С++

Я изучаю программирование сокетов на С++... Программа сервера привязывается к сокету и начинает прослушивать запросы на подключение... хорошо, теперь как я могу перечислить IP-адреса прослушанных запросов? Я знаю, что могу получить IP-адреса после принятия соединений, но скажем, я не хочу принимать соединение с определенного IP-адреса...


person Mortie    schedule 23.05.2012    source источник
comment
Разве вы не должны использовать брандмауэр для управления этим типом требований?   -  person Eric J.    schedule 24.05.2012
comment
Чувак, я программирую!!!   -  person Mortie    schedule 24.05.2012
comment
Я согласен. Именно для этого существует множество мер безопасности маршрутизаторов/коммутаторов. Я думаю, что лучшее, что вы можете сделать, это немедленно закрыть соединение, если IP-адрес находится в вашем черном списке.   -  person chris    schedule 24.05.2012


Ответы (3)


Для оптимальной производительности это может быть решено путем фильтрации в сетевом стеке, но детали этого будут зависеть от операционной системы (это не часть интерфейса сокета, и ваше приложение может вообще не иметь прав на настройку вашей сети). складывайте таким образом.)

Другая возможность — после accept, когда соединение уже принято (CONNECT ACK) на уровне TCP.

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

person Jirka Hanika    schedule 23.05.2012
comment
Я не эксперт, но не опасно ли принимать соединение только для того, чтобы получить IP-адрес? - person Mortie; 24.05.2012
comment
@user1378573 user1378573, на данный момент он прошел через брандмауэр и все настройки в сети, которые выполняют всю проверку IP-адреса и т. д. - person chris; 24.05.2012
comment
@ user1378573 - Вызов accept никому не дает никаких новых прав. Это просто позволяет получить доступ к отдельному соединению на вашей стороне через API сокетов. Другая сторона относительно мало может вам навредить; атака типа «отказ в обслуживании» или обнаружение того, что ваш порт открыт. Но они могли бы сделать то же самое, даже если бы вы не согласились. Вы не можете имитировать брандмауэр на уровне приложения. - person Jirka Hanika; 24.05.2012

Только в Windows вы можете использовать функцию условного обратного вызова WinSock2 WSAAccept() для доступа к информации о клиенте перед принятием соединения и даже для отклонения соединения до того, как оно будет принято.

person Remy Lebeau    schedule 23.05.2012
comment
Ничего себе, я не знал об этом (хотя я думал, что очень хорошо знаю winsock2). Но я считаю, что эти конкретные вещи изначально не поддерживаются драйвером TCP. - person valdo; 24.05.2012

Это невозможно сделать с точки зрения стандартного API сокетов. На всех известных мне платформах система фактически принимает соединение (т. е. отвечает TCP-дейтаграммой SYN+ACK) прежде, чем приложение получает возможность отслеживать ожидающий запрос.

person valdo    schedule 23.05.2012
comment
Если вы не используете UDP, в этом случае вы даже не будете проходить через всю эту суету. - person chris; 24.05.2012
comment
Так что же он делает, когда слушает? Какие данные он собирает тогда? - person Mortie; 24.05.2012