2012-03-21 4 views
2

Я пишу приложение TCP-сервера с помощью Winsock. Клиент, который подключается ко мне (для которого у меня нет источника и, следовательно, не могу вносить изменения), ведет себя следующим образом: если он подключается и я закрываю соединение (потому что он является нежелательным клиентом), он немедленно подключается. В результате я буду вращаться, как сумасшедший, над моими вызовами accept(), если есть клиент, который хочет подключиться ко мне, но с кем я не хочу разговаривать (то есть, что я назвал нежелательным клиентом) ,Принятие TCP-соединений с точностью до 2 IP-адресов

Я хотел бы найти способ предотвратить, что сумасшедший вращается над моими вызовами accept(). Если бы был только один желаемый клиент, я мог бы привязать мой прослушивающий сокет к IP-адресу этого клиента, а не INADDR_ANY. Но, увы, есть более 1 желаемого клиента. Насколько я знаю, нет возможности разрешить соединения только из набора желаемых IP-адресов, если размер этого набора больше 1.

Я просмотрел WSAAccept. К сожалению, похоже, что это просто сменит безумное вращение на обратный вызов.

Есть ли способ отклонить попытку подключения, которая не предполагает принятие() пробуждения и возврата (и, следовательно, приводит ко всему этому безумному вращению)?

+1

Можете ли вы заблокировать или фильтровать входящие соединения на этом порту с помощью брандмауэра? –

ответ

2

Я считаю, что ваш вопрос уже задан в stackoverflow в прошлом. Может быть, глядя на этих двух потоков поможет вам с вашей проблемой:

Если вы боитесь испытать Dos атаки или о производительности вопросы принимают, действуют на уровне 4 OSI stack, относительно низком уровне, который обрабатывает SYN-A CK-отрицание с клиентом, поэтому базовое соединение извне сразу же упало после того, как accept() не вызовет важных проблем с производительностью.

Если вы хотите абсолютно принять два IP-адреса, я думаю, вам, возможно, придется использовать либо межсетевой экран, либо RAW-сокеты, чтобы напрямую получать IP-адрес из пакета TCP и принимать соединение самостоятельно, но это будет, Я думаю, огромная потеря времени.