如何使用winsock限制每个IP的连接?
假设我想将它们限制为每个IP 20个连接,然后一旦达到限制就不接受连接。
我无法想到这样做的逻辑。
我曾考虑在callbacks
上使用WSAAccept()
并在接受连接之前登录每个ip的数据库,并在db上为每个连接列出它。
[check if column count is <= 20]
return CF_ACCEPT;
}else{
return CF_REJECT;
但是有更有效的方法吗?
答案 0 :(得分: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;
}