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

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

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

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

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

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

1 ответ

Решение

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