Чтобы программа Winsock принимала соединения только с определенных IP-адресов, используйте механизм условного принятия WSAAccept()
. Сначала включите функцию:
SOCKET sd = socket(...);
listen(sd, ...);
DWORD nTrue = 1;
setsockopt(sd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (char*)&nTrue, sizeof(nTrue));
Затем измените ваш запрос на прием, чтобы он выглядел примерно так:
sockaddr_in sin;
WSAAccept(sd, (sockaddr*)&sin, sizeof(sin), ConditionalAcceptChecker, 0);
ConditionalAcceptChecker
- это функция, которую вы пишете, которая принимает решение о том, будет ли стек принимать или отклонять соединение. Если он отклоняет его, удаленный узел получает пакет TCP RST, поэтому он знает, что он был отклонен.
Если вы хотите, чтобы сетевой стек молча отбрасывал попытки подключения с других адресов без уведомления удаленного узла, вы должны сделать это на более низком уровне, чем Winsock. В Vista или Windows Server 2008 и более поздних версиях эта команда изменит правила брандмауэра для достижения желаемого эффекта:
netsh advfirewall firewall add rule name=MyProtocol dir=in remoteip=1.2.3.4
localport=1234 protocol=tcp action=allow
Это одна команда, разделенная из-за ограничений форматирования при переполнении стека.
Это говорит о том, что удаленному компьютеру по IP 1.2.3.4 разрешено подключаться к TCP-порту 1234 на этом компьютере. Если у вас включен брандмауэр в режиме по умолчанию, который отклоняет трафик, который специально не разрешен, попытки подключения со всех других компьютеров будут отклонены.
В более старых версиях Windows, начиная с XP, существует другой синтаксис «netsh firewall» для получения того же эффекта. Просто наберите «netsh firewall» в командной строке, чтобы начать просмотр встроенной справки.