Ограничение соединений на ip с помощью winsock

Как вы ограничиваете соединения на IP с winsock?
Допустим, я хотел ограничить их до 20 подключений на IP, а затем не принимать подключение, как только оно достигнет предела.

Я не могу думать о логике делать это.

Я думал об использовании callbacks на WSAAccept() и входите в базу данных каждый ip, прежде чем принимать соединение, и перечисляйте его в БД для каждого сделанного соединения.

[check if column count is <= 20]
return CF_ACCEPT;
}else{
return CF_REJECT;

Но есть ли более эффективный способ сделать это?

0

Решение

Я бы не использовал базу данных для этого. Достаточно простой таблицы поиска в памяти, такой как 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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]