Как вы ограничиваете соединения на IP с winsock?
Допустим, я хотел ограничить их до 20 подключений на IP, а затем не принимать подключение, как только оно достигнет предела.
Я не могу думать о логике делать это.
Я думал об использовании callbacks
на WSAAccept()
и входите в базу данных каждый ip, прежде чем принимать соединение, и перечисляйте его в БД для каждого сделанного соединения.
[check if column count is <= 20]
return CF_ACCEPT;
}else{
return CF_REJECT;
Но есть ли более эффективный способ сделать это?
Я бы не использовал базу данных для этого. Достаточно простой таблицы поиска в памяти, такой как std::map
, Но в целом вы на правильном пути, используя WSAAccept()
Перезвоните. Единственный другой вариант — принять соединение, а затем немедленно закрыть его, если это необходимо.
Обновить: пример использования std::map
:
#include <map>
std::map<ulong, int> ipaddrs;
...
// when a client connects...
ulong ip = ...;
int &count = ipaddrs[ip];
if (count < 20)
{
++count;
return CF_ACCEPT;
}
else
{
return CF_REJECT;
}
...// when an accepted client disconnects...
ulong ip = ...;
int &count = ipaddrs[ip];
if (count > 0)
{
--count;
}
Других решений пока нет …